美文网首页
Executors静态工厂方法(gold_axe)

Executors静态工厂方法(gold_axe)

作者: 胖达_4b7e | 来源:发表于2020-10-24 22:41 被阅读0次

里面包ThreadPoolExecutor 的都不建议使用:
主要是因为
要么 无限队列 : newSingleThreadExecutor,newFixedThreadPool
要么 无限线程 : newFixedThreadPool,newScheduledThreadPool
会OOM

可以方便的创建一些预配置的线程池,主要方法有:

newSingleThreadExecutor:始终一个线程,所有任务排队进行,无限队列!:

public static ExecutorService newSingleThreadExecutor() {
    return new ThreadPoolExecutor(1, 1,//始终一个线程
                                0L, TimeUnit.MILLISECONDS,//就一个线程,永不回收
                                new LinkedBlockingQueue<Runnable>());//无限排队
}

该线程池适用于需要确保所有任务被顺序执行的场合。

newFixedThreadPool固定线程,永不回收,无限长的排队(死锁就是它):
用于已经知道有多大并发压力的, 可以确定线程数的

public static ExecutorService newFixedThreadPool(int nThreads) {
    return new ThreadPoolExecutor(nThreads, nThreads,//固定线程数
                                  0L, TimeUnit.MILLISECONDS,//永不超时
                                  new LinkedBlockingQueue<Runnable>());//无界队列
}

如果排队任务过多,可能会消耗非常大的内存。

newCachedThreadPool 无固定线程数.不用排队,线程空闲60秒就回收:
适合 任务执行时间短的

public static ExecutorService newCachedThreadPool() {
    return new ThreadPoolExecutor(0, 
                              Integer.MAX_VALUE,//几乎无上限的线程数
                                  60L, TimeUnit.SECONDS,//空闲60秒超时
                                  new SynchronousQueue<Runnable>());//无等待队列
}

会创建太多线程的高负荷情况下, 太多竞争CPU和内存资源,不宜使用
一般情况,任务可以不经排队,直接交给某一个空闲线程 效率比newFixedThreadPool

newScheduledThreadPool 定时任务, 无限线程, 只有一个线程

newWorkStealingPool
适合大任务分解并行执行, 基于ForkJoinPool, 工作窃取的算法 把任务分解成无关的子任务

相关文章

网友评论

      本文标题:Executors静态工厂方法(gold_axe)

      本文链接:https://www.haomeiwen.com/subject/tqzwmktx.html