java线程池,java线程池有几种

将乐信息网 http://www.jianglexinxi.cn 2020-07-01 08:06 出处:网络
java线程池,java线程池有几种,java线程池,阿里为什么不允许使用Executors? 那么这三个参数推荐如何设置,有最优值吗?

java线程池,java线程池有几种,java线程池,阿里为什么不允许使用Executors?

那么这三个参数推荐如何设置,有最优值吗?

由于java对于协程的支持不友好,所以会大量依赖于线程池和线程。
从而这个值没有最优推荐,需要根据业务需求情况来进行设置。
不同的需求类型可以创建多个不同的线程池来执行。

问题1:阿里开发规范为什么不允许Executors快速创建线程池?

java线程池,java线程池有几种

参考地址:https://github.com/alibaba/p3c

可以看到原因很简单

newSingleThreadExecutor newFixedThreadPool

在 workQueue 参数直接 使用了 new LinkedBlockingQueue Runnable () 理论上可以无限添加任务到线程池。

public static ExecutorService newFixedThreadPool(int nThreads) {
 return new ThreadPoolExecutor(nThreads, nThreads,
 0L, TimeUnit.MILLISECONDS,
 new LinkedBlockingQueue Runnable 
public static ExecutorService newSingleThreadExecutor() {
 return new FinalizableDelegatedExecutorService(new ThreadPoolExecutor(1,
 TimeUnit.MILLISECONDS,
 new LinkedBlockingQueue Runnable ()));

如果提交到线程池的任务由问题,比如 sleep 永久,会造成内存泄漏,最终导致OOM。

同时 阿里还推荐自定义 threadFactory 设置线程名称便于以后排查问题。

问题2:下面的代码输出是什么?

应该选C。
虽然最大线程数有100但核心线程数为1,任务队列由100。
满足了 '当线程数大于等于核心线程数,且任务队列未满时,将任务放入任务队列。' 这个条件。
所以后续添加的任务都会被堵塞。

关于 ThreadPoolExecutor 的逻辑在实际使用的时候会有点奇怪,因为线程池中的线程并没有超过最大线程数,有没有一种可能当任务被堵塞很久的时候创建新的线程池来处理呢?

这边推荐大家使用 newWorkStealingPool,也就是ForkJoinPool。采取了工作窃取的模式。
后续会跟大家一起聊聊 ForkJoinPool。

本文标题:java线程池,java线程池有几种
http://www.jianglexinxi.cn/yanergaozhi/411012.html

0

精彩评论

暂无评论...
验证码 换一张
取 消