标签:速度 override 任务队列 如何使用 tor now() 直接 pointer image
池化技术:提前准备一些资源,在需要时可以重复使用这些预先准备的资源。常见的池化技术的使用有:线程池、内存池、数据库连接池、HttpClient 连接池。
线程池作为池化技术的一种实践,本质上也是同样的思想,提前备好资源以备不时之需。因此,线程池相比较任务出现再创建线程具有以下的优点:
如上图所示,一个新任务进入到线程池时,处理流程如下:
先来看阿里巴巴的Java开发手册,对于线程池的创建规定。
我们在创建线程池的过程中,使用底层的new ThreadPollExecutor,其源码如下
public ThreadPoolExecutor(int corePoolSize,
int maximumPoolSize,
long keepAliveTime,
TimeUnit unit,
BlockingQueue<Runnable> workQueue,
ThreadFactory threadFactory,
RejectedExecutionHandler handler) {
if (corePoolSize < 0 ||
maximumPoolSize <= 0 ||
maximumPoolSize < corePoolSize ||
keepAliveTime < 0) //检查输入参数是否异常
throw new IllegalArgumentException();
if (workQueue == null || threadFactory == null || handler == null)
throw new NullPointerException(); //检查工作队列、线程工厂、拒绝策略是否空指针
//对属性开始赋值
this.acc = System.getSecurityManager() == null ?
null :
AccessController.getContext();
this.corePoolSize = corePoolSize;
this.maximumPoolSize = maximumPoolSize;
this.workQueue = workQueue;
this.keepAliveTime = unit.toNanos(keepAliveTime);
this.threadFactory = threadFactory;
this.handler = handler;
}
线程池创建的七大参数:
具有executre()和submit()方法
//execute()提交不需要返回值的任务
threadPool.execute(new Runnable() {
@Override
public void run() {
//TODO
}
});
//submit()提交需要返回值的任务
Callable myCallable = new Callable() {
@Override
public String call() throws Exception {
Thread.sleep(3000);
return "call方法返回值";
}
};
Future future = threadPool.submit(myCallable);
String futureRes = future.get();
//会停止所有正在执行任务的线程
threadPool.shutdownNow();
//只中断没有执行任务的线程
threadPool.shudown();
目前公司的项目,用简单的HttpServer暴露prometheus的metrics的内容,设置的是fixThreadPool,线程数设置为5,就是根据Ncpu * 2得到的经验值。
CPU密集性应尽量配置最少的线程,如配置Ncpu + 1个线程的线程池;IO密集型任务线程并不是一直在执行任务,则应配置尽可能多的线程,如Ncpu * 2。
有界队列能增加系统的稳定性和预警能力,可以根据需要设大一点儿,比如几千。
标签:速度 override 任务队列 如何使用 tor now() 直接 pointer image
原文地址:https://www.cnblogs.com/coderhu1/p/14587449.html