java中线程池1

Java中这种复杂的线程池应用,简单来说其实非常简单。
线程池维护一组可重用的线程来处理任务并解决资源限制、性能损失和CPU利用率等问题。

我们先说最重要的,比如我们去年跑的大规模数据处理项目。
由于工作量较大,单线程处理显然效率不够。
我们设置核心线程数为4 ,最大线程数为1 0,并使用LinkedBlockingQueue作为队列,大大提高了处理效果。
还有一点,我还设置了一个CustomThreadFactory来自定义线程名称,方便后期问题定位。
一个重要的细节是,在工作高峰期,线程池可以自动扩展到最大线程数,这样可以有效提高系统吞吐量。

我一开始以为核心线程数和最大线程数可以任意设置,后来发现这是错误的。
对于CPU密集型任务,核心线程数应该接近CPU核心数,而对于IO密集型任务,可以适当增加核心线程数和排队能力。

等一下,还有一件事。
使用LinkedBlockingQueue这样的异步队列时,要注意OOM的风险。
虽然SynchronousQueue适合高吞吐量的场景,但它经常可能会触发拒绝策略。

最后,提醒一下一个方便的陷阱:监控和调整这样做时,通过ThreadPoolExecutor方法监控线程池状态,并根据实际负载动态调整参数,但要注意线程池参数修改的线程安全性。

我觉得配置线程池的时候值得一试,根据任务的特点,以及任务队列的类型和大小来设置核心线程数和最大线程数。
这不仅提高了性能,还避免了不必要的资源浪费。

在Java中如何使用ExecutorService管理线程池

结论:在Java中,使用ThreadPoolExecutor创建线程池,执行或提交任务,并使用shutdown()关闭池。
为了优化生产环境,需要配置队列限制和丢弃策略。

创建:
Executors.newFixedThreadPool(4 ):4 个线程,无限队列是危险的,有限队列用于生产。

Executors.newCachedThreadPool():动态扩展,注意线程数风险。

Executors.newSingleThread Executor():序列化任务。

Executors.newScheduledThreadPool(2 ):支持延迟或周期性任务。

推荐:ThreadPoolExecutor(2 , 1 0, 6 0, TimeUnit.SECONDS, ArrayBlockingQueue(1 00), AbortPolicy())
提交:
无返回值:executor.ejector(() ->);
返回值为:Future future = executor.submit(() -> { Thread.sleep(1 000); return 4 2 ; }); future.get();
关闭:
经典关闭:executor.shutdown(); executor.awaitTermination(6 0, TimeUnit.SECONDS); 紧急关闭:executor.shutdownNow();
优化:
避免指定无限队列和队列容量。

选择拒绝策略:CallerRunsPolicy、DiscardPolicy、DiscardOldestPolicy。

监控线程线程状态:getActiveCount()、getQueue().size()。

总结:合理使用ExecutorService,提高并发性能和稳定性。

为什么阿里开发手册要禁用Executors创建线程池?

阿里巴巴禁止使用执行器创建线程池,因为执行器的默认配置会导致内存溢出和性能问题。

1 . Executors.newCachedThreadPool:创建无限线程是有风险的,可能会导致内存溢出。
2 、Executors.newSingleThreadExecutor:无限队列,maximumPoolSize和keepAliveTime无效。
3 . Executors.newFixedThreadPool:使用无界线程可能会导致内存溢出。

定制的ThreadPoolExecutor可以灵活配置设置并优化性能和资源管理。
建议根据任务类型(CPU密集型或I/O密集型)和业务场景合理设置线程池参数,如队列容量、拒绝策略等,避免内存溢出。