
//四个拒绝策略
//new ThreadPoolExecutor.AbortPolicy(); //银行满了 还有人进来 不再处理,抛出异常
//new ThreadPoolExecutor.CallerRunsPolicy(); //银行满了 还有人进来 哪来的去哪里
//new ThreadPoolExecutor.DiscardPolicy(); //银行满了 还有人进来 不再处理,不会抛出异常
//new ThreadPoolExecutor.DiscardOldestPolicy(); //银行满了 尝试和最早的竞争,也不会抛出异常
public class Demo02 {
// 最大线程到底该如何定义
//CPU密集型,几核我们就定义为几个数,保持CPU效率最高
//IO密集型,判断你程序组十分耗IO的线程,大于这个数就OK,比如15个大型任务,IO十分占用资源就用30个数
public static void main(String[] args) {
//获取CPU核数
System.out.println(Runtime.getRuntime().availableProcessors());
ExecutorService threadPool = new ThreadPoolExecutor(2, //核心线程2
Runtime.getRuntime().availableProcessors(), //最大线程Runtime.getRuntime().availableProcessors()获取CPU核数,或者填数字5
3, TimeUnit.SECONDS, //超过等待3秒释放线程回到核心2个数
new LinkedBlockingDeque<>(3),//等待区
Executors.defaultThreadFactory(), //默认线程工厂,一般不会改
new ThreadPoolExecutor.DiscardOldestPolicy()); //银行满了 尝试和最早的竞争,也不会抛出异常
try {
for (int i = 1; i <= 9; i++) {
//使用线程池创建线程
threadPool.execute(()->{
System.out.println(Thread.currentThread().getName()+" OK");
});
}
} catch (Exception e) {
e.printStackTrace();
} finally {
//线程池用完需关闭
threadPool.shutdown();
}
}
}
本文介绍了四种不同的线程池拒绝策略,并通过示例展示了如何在Java中使用`ThreadPoolExecutor`,结合CPU密集型和IO密集型场景调整核心线程数。重点讲解了`DiscardOldestPolicy`策略在满载时的处理方式。
1456

被折叠的 条评论
为什么被折叠?



