美文网首页java基础专题
java基础专题:2. java四种线程池的区别

java基础专题:2. java四种线程池的区别

作者: 北交吴志炜 | 来源:发表于2019-01-09 21:52 被阅读0次

java有四种线程池

Executors.newSingleThreadExecutor
Executors.newFixedThreadPool
Executors.newCachedThreadPool
Executors.newScheduledThreadPool

这四种线程池,本质上,都是调用ThreadPoolExecutor方法进行构造的。
那么他们的差异在本质上是什么造成的呢?两点
1.线程数 2排队的阻塞队列类型
上代码 Executors

1.newSingleThreadExecutor

public static ExecutorService newSingleThreadExecutor() {
        return new FinalizableDelegatedExecutorService
            (new ThreadPoolExecutor(1, 1,
                                    0L, TimeUnit.MILLISECONDS,
                                    new LinkedBlockingQueue<Runnable>()));
    }

可以看到,核心线程数,最大线程数都是1,排队队列是LinkedBlockingQueue,队列大小是Integer.MAX_VALUE

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

可以看到,核心线程数,最大线程数都是n,排队队列也是LinkedBlockingQueue,队列大小是Integer.MAX_VALUE

  1. newCachedThreadPool
public static ExecutorService newCachedThreadPool() {
        return new ThreadPoolExecutor(0, Integer.MAX_VALUE,
                                      60L, TimeUnit.SECONDS,
                                      new SynchronousQueue<Runnable>());
    }

核心线程数0,最大线程数Integer.MAX_VALUE,排队队列跟之前的不一样了,是
SynchronousQueue。

  1. newScheduledThreadPool
public ScheduledThreadPoolExecutor(int corePoolSize) {
        super(corePoolSize, Integer.MAX_VALUE, 0, NANOSECONDS,
              new DelayedWorkQueue());
    }

核心线程n,最大线程 Integer.MAX_VALUE,最特殊的是队列DelayedWorkQueue

核心线程数和最大线程数的区别自己体会,主要说一下这个排队队列
1.newCachedThreadPool,采用的是一个SynchronousQueue,其内部并没有数据缓存空间,一个插入操作总是对应一个移除操作,新任务到来时,这个线程池就会创建新的线程

  1. newScheduledThreadPool ,这个线程池采用的队列是DelayedWorkQueue,这个阻塞队列的特点
    1). 按照执行延迟从短到长的顺序把任务存储到堆;

2). 通过leader线程让拿到任务的线程等到规定的时间点再执行任务;具体见
https://www.cnblogs.com/wanly3643/p/3929761.html

相关文章

网友评论

    本文标题:java基础专题:2. java四种线程池的区别

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