java线程池的学习
参数介绍:
corePoolSize - 即使空闲时仍保留在池中的线程数,除非设置 allowCoreThreadTimeOut
maximumPoolSize - 池中允许的最大线程数
keepAliveTime - 当线程数大于核心时,这是多余的空闲线程在终止之前等待新任务的最大时间。
unit - keepAliveTime参数的时间单位
workQueue - 在执行任务之前用于保存任务的队列。 该队列将仅保存execute方法提交的Runnable任务
/**
*
* @param corePoolSize 核心线程池的大小
* @param maximumPoolSize 最大线程池的大小
* @param keepAliveTime 线程池中超过corePoolSize数目的空闲线程最大存活时间;可以
* allowCoreThreadTimeOut(true)使得核心线程有效时间
* @param unit 时间单位
* @param workQueue 用来暂时保存任务的工作队列
* @param threadFactory 创建线程的工厂
* @param handler 当提交任务数超过maximumPoolSize+workQueue之和时,任务会交给RejectedExecutionHandler来处理
*当ThreadPoolExecutor已经关闭或ThreadPoolExecutor已经饱和
* 时(达到了最大线程池大小且工作队列已满),execute()方法将要调用的Handler
*
* 1.当线程小于corePoolSize时,新提交任务将创建一个新线程执行任务,即使此时线程池中存在空闲线程。
* 2.当线程达到corePoolSize时,新提交任务将被放入workQueue中,等待线程池中任务调度执行
* 3.当workQueue已满,且maximumPoolSize>corePoolSize时,新提交任务会创建新线程执行任务
* 4.当提交任务数超过maximumPoolSize时,新提交任务由RejectedExecutionHandler处理
* 5.当线程池中超过corePoolSize线程,空闲时间达到keepAliveTime时,关闭空闲线程
* 6.当设置allowCoreThreadTimeOut(true)时,线程池中corePoolSize线程空闲时间达到keepAliveTime也将关闭
*/
public ThreadPoolExecutor(int corePoolSize,
int maximumPoolSize,
long keepAliveTime,
TimeUnit unit,
BlockingQueue<Runnable> workQueue,
ThreadFactory threadFactory,
RejectedExecutionHandler handler);
}
2.ThreadPoolExecutor和Future的使用
public class ThreadPoolExecutorFutureTest {
public static void main(String[] args) throws Exception {
ThreadPoolExecutor poolExecutor = new ThreadPoolExecutor(3, 3, 60,
TimeUnit.SECONDS, new LinkedBlockingDeque<Runnable>(1000));
//放入list提高返回的效率
List<Future> futureList = new ArrayList<>();
for(int i=0;i<=100;i++){
Future<String> future = poolExecutor.submit(new Callable<String>() {
@Override
public String call() throws Exception {
Thread.sleep(2000);
return Thread.currentThread().getName();
}
});
futureList.add(future);
}
Iterator<Future> iterator = futureList.iterator();
while (iterator.hasNext())
System.out.println(iterator.next().get());
poolExecutor.shutdown();
}
}
ThreadPoolExecutor中的keepAliveTime详解
https://blog.csdn.net/u010841296/article/details/89419115
ThreadPoolExecutor线程池的keepAliveTime
https://www.cnblogs.com/zxporz/p/10940251.html
java线程池及创建多少线程合适
IO 密集计算,如何将硬件利用率达到极致呢 我们将 R = IO 耗时 / Cpu耗时 我们从上面的例子来看,如果 IO 耗时 / Cpu 耗时 = 10 (我们平常可以用工具 apm 来统计这个比例),创建线程 A 执行 io 操作,我们希望 IO 操作的时候 Cpu 不能闲着,所以就应该创建 10 个线程去执行 Cpu 计算,当 Io 操作完毕后刚好 Cpu 也执行完毕,他们的利用率都是百分之 100 在执行这段代码的时候。这个例子我们要创建 1 + 10 = 11 个线程执行起来效率更高,于是我们就得到了公式: 1 + I/O耗时 / Cpu耗时,
如果是多核 Cpu 最佳线程数 = CPU 核数 * [ 1 +(I/O 耗时 / Cpu 耗时)
Cpu 密集型,这个就很简单了,Cpu 的核数 = 线程数就行,一般我们会设置 Cpu 核数 + 1,防止由于其他因素导致线程阻塞等
最佳线程数=CPU核数×[1+(I/O耗时/CPU耗时)]
线程数=CPU核数×目标CPU利用率×(1+平均等待时间/平均工作时间)
https://www.cnblogs.com/volare/p/12286822.html
https://blog.csdn.net/qq_40378034/article/details/100556161