线程池及使用场景说明
持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第22天,点击查看活动详情
newFixedThreadPool(固定大小的线程池):
public static ExecutorService newFixedThreadPool(int nThreads) {
return new ThreadPoolExecutor(nThreads, nThreads,
0L, TimeUnit.MILLISECONDS, new LinkedBlockingQueue<Runnable>());
}
该线程池特点:
1.核心线程数和最大线程数大小一样
2.keepAliveTime为0
3.阻塞队列使用的是LinkedBlockingQuene(无界队列)
该线程池工作机制:
1.线程数少于核心线程数,新建线程执行任务
2.线程数等于核心线程数时,将任务加到阻塞队列(最大值为Integer.MAX_VALUE),可以一直加加加(可能会出现OOM)
newSingleThreadExecutor(单线程线程池)
public static ExecutorService newSingleThreadExecutor() {
return new FinalizableDelegatedExecutorService (new ThreadPoolExecutor(1, 1, 0L,
TimeUnit.MILLISECONDS, ew LinkedBlockingQueue<Runnable>()));
}
该线程池特点:
1.核心线程数和最大线程数大小一样且都是1
2.keepAliveTime为0
3.阻塞队列是LinkedBlockingQuene
该线程池工作机制:
1.线程中没有线程时,新建线程执行任务
2有一个线程以后,将任务加到阻塞队列(最大值为Integer.MAX_VALUE),可以一直加加加
#### 该线程池特点:
1.核心线程数为0,且最大线程数为Integer.MAX_VALUE
2.阻塞队列是SynchronousQuene(同步队列)
SynchronousQuene:一个不存储元素的阻塞队列。每个插入操作必须等到另一个线程调用移除操作,否则插入操作一直处于阻塞状态,吞吐量要高于LInkedBlockQuene。
锁当提交任务的速度大于处理任务的速度时,每次提交一个任务,就必然会创建一个线程。极端的情况下会创建过多的线程,耗尽CPU和内存资源。由于空闲60秒的线程会被终止,长时间保持空闲的CachedThreadPool不会占用任何资源。
#### 该线程池工作机制:
1.没有核心线程时,直接向SynchronousQuene中提交任务
2.执行完任务的线程有60秒处理时间
newScheduledThreadPoo
该线程池特点:
1.最大线程数为Integer.MAX_VALUE
2.阻塞队列是DelayedWorkQuene(延迟队列)
DelayedWorkQuene中封装了一个优先级队列,这个队列会对队列中的ScheduleFutureTask进行排序,两个任务的执行Time不同时,time小的先执行; 否则比较添加队列中的ScheduledFutureTask的顺序号sequenceNumber,先提交的先执行。
API
ScheduledThreadPoolExecutor添加任务提供了另外两个方法:
1.scheduleAtFixedRate():按某种速率周期执行
2.scheduleWithFixedDelay():在某个延迟后执行
两种方法的内部实现都是创建了一个ScheduledFutureTask对象封装了任务的延迟执行时间及执行周期,并调用decorateTask()方法转成RunnableScheduledFuture对象,然后添加到队列中。
该线程池工作机制:
1.调用上面两个方法添加一个任务
2.线程池中的线程从DelayQuene中取任务
3.然后执行任务
作者:北洋
链接:https://juejin.cn/post/7112061831132708878
来源:稀土掘金
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。