newFixedThreadPool (固定数目线程的线程池)oKO28资讯网——每日最新资讯28at.com
oKO28资讯网——每日最新资讯28at.com
newCachedThreadPool (可缓存线程的线程池)oKO28资讯网——每日最新资讯28at.com
oKO28资讯网——每日最新资讯28at.com
newSingleThreadExecutor (单线程的线程池)oKO28资讯网——每日最新资讯28at.com
oKO28资讯网——每日最新资讯28at.com
newScheduledThreadPool (定时及周期执行的线程池)oKO28资讯网——每日最新资讯28at.com
oKO28资讯网——每日最新资讯28at.com
前三种线程池的构造直接调用ThreadPoolExecutor的构造方法。oKO28资讯网——每日最新资讯28at.com
oKO28资讯网——每日最新资讯28at.com
newSingleThreadExecutor
oKO28资讯网——每日最新资讯28at.com
public static ExecutorService newSingleThreadExecutor(ThreadFactory threadFactory) { return new FinalizableDelegatedExecutorService(new ThreadPoolExecutor(1, 1,0L,TimeUnit.MILLISECONDS, new LinkedBlockingQueue<Runnable>(),threadFactory));}
线程池特点:oKO28资讯网——每日最新资讯28at.com
oKO28资讯网——每日最新资讯28at.com
核心线程数:1oKO28资讯网——每日最新资讯28at.com
oKO28资讯网——每日最新资讯28at.com
最大线程数:1oKO28资讯网——每日最新资讯28at.com
oKO28资讯网——每日最新资讯28at.com
阻塞队列是无界队列LinkedBlockingQueue,可能会导致OOMoKO28资讯网——每日最新资讯28at.com
oKO28资讯网——每日最新资讯28at.com
keepAliveTime:0oKO28资讯网——每日最新资讯28at.com
oKO28资讯网——每日最新资讯28at.com
oKO28资讯网——每日最新资讯28at.com
oKO28资讯网——每日最新资讯28at.com
oKO28资讯网——每日最新资讯28at.com
工作流程:oKO28资讯网——每日最新资讯28at.com
oKO28资讯网——每日最新资讯28at.com
1、提交任务oKO28资讯网——每日最新资讯28at.com
oKO28资讯网——每日最新资讯28at.com
2、线程池是否有一条线程在,如果没有,新建线程执行任务oKO28资讯网——每日最新资讯28at.com
oKO28资讯网——每日最新资讯28at.com
3、如果有,将任务加到阻塞队列oKO28资讯网——每日最新资讯28at.com
oKO28资讯网——每日最新资讯28at.com
4、当前的唯一线程,从队列取任务,执行完一个,再继续,一个线程执行任务oKO28资讯网——每日最新资讯28at.com
oKO28资讯网——每日最新资讯28at.com
适用场景:oKO28资讯网——每日最新资讯28at.com
oKO28资讯网——每日最新资讯28at.com
适用于串行执行任务的场景,一个任务一个任务地执行oKO28资讯网——每日最新资讯28at.com
oKO28资讯网——每日最新资讯28at.com
newFixedThreadPool
oKO28资讯网——每日最新资讯28at.com
public static ExecutorService newFixedThreadPool(int nThreads, ThreadFactory threadFactory) { return new ThreadPoolExecutor(nThreads, nThreads,0L,TimeUnit.MILLISECONDS, new LinkedBlockingQueue<Runnable>(), threadFactory);}
线程池特点:oKO28资讯网——每日最新资讯28at.com
oKO28资讯网——每日最新资讯28at.com
核心线程数和最大线程数大小一样;oKO28资讯网——每日最新资讯28at.com
oKO28资讯网——每日最新资讯28at.com
没有所谓的非空闲时间,即keepAliveTime为0;oKO28资讯网——每日最新资讯28at.com
oKO28资讯网——每日最新资讯28at.com
阻塞队列为无界队列LinkedBlockingQueue,可能会导致OOM;oKO28资讯网——每日最新资讯28at.com
oKO28资讯网——每日最新资讯28at.com
oKO28资讯网——每日最新资讯28at.com
oKO28资讯网——每日最新资讯28at.com
oKO28资讯网——每日最新资讯28at.com
工作流程:oKO28资讯网——每日最新资讯28at.com
oKO28资讯网——每日最新资讯28at.com
1、提交任务;oKO28资讯网——每日最新资讯28at.com
oKO28资讯网——每日最新资讯28at.com
2、如果线程数少于核心线程,创建核心线程执行任务;oKO28资讯网——每日最新资讯28at.com
oKO28资讯网——每日最新资讯28at.com
3、如果线程数等于核心线程,把任务添加到LinkedBlockingQueue阻塞队列;oKO28资讯网——每日最新资讯28at.com
oKO28资讯网——每日最新资讯28at.com
4、如果线程执行完任务,去阻塞队列取任务,继续执行。oKO28资讯网——每日最新资讯28at.com
oKO28资讯网——每日最新资讯28at.com
适用场景:oKO28资讯网——每日最新资讯28at.com
oKO28资讯网——每日最新资讯28at.com
FixedThreadPool适用于处理CPU密集型的任务,确保CPU在长期被工作线程使用的情况下,尽可能少的分配线程,即适用执行长期的任务。oKO28资讯网——每日最新资讯28at.com
oKO28资讯网——每日最新资讯28at.com
newCachedThreadPool
oKO28资讯网——每日最新资讯28at.com
public static ExecutorService newCachedThreadPool(ThreadFactory threadFactory) { return new ThreadPoolExecutor(0, Integer.MAX_VALUE, 60L, TimeUnit.SECONDS, new SynchronousQueue<Runnable>(), threadFactory);}
线程池特点:oKO28资讯网——每日最新资讯28at.com
oKO28资讯网——每日最新资讯28at.com
核心线程数为0;oKO28资讯网——每日最新资讯28at.com
oKO28资讯网——每日最新资讯28at.com
最大线程数为Integer.MAX_VALUE,即无限大,可能会因为无线创建线程,导致OOMoKO28资讯网——每日最新资讯28at.com
oKO28资讯网——每日最新资讯28at.com
阻塞队列是SynchronousQueueoKO28资讯网——每日最新资讯28at.com
oKO28资讯网——每日最新资讯28at.com
非核心线程空闲存活时间为60soKO28资讯网——每日最新资讯28at.com
oKO28资讯网——每日最新资讯28at.com
当提交任务速度大于处理任务的速度时,每次提交一个任务,就必然会创建一个线程。oKO28资讯网——每日最新资讯28at.com
oKO28资讯网——每日最新资讯28at.com
极端情况下会创建过多的线程,耗尽CPU和内存资源。由于空闲60秒的线程会被终止,长时间保持空闲的CachedThreadPool不会占用任何资源。oKO28资讯网——每日最新资讯28at.com
oKO28资讯网——每日最新资讯28at.com
oKO28资讯网——每日最新资讯28at.com
oKO28资讯网——每日最新资讯28at.com
oKO28资讯网——每日最新资讯28at.com
工作流程:oKO28资讯网——每日最新资讯28at.com
oKO28资讯网——每日最新资讯28at.com
提交任务;oKO28资讯网——每日最新资讯28at.com
oKO28资讯网——每日最新资讯28at.com
因为没有核心线程,所以任务会直接加到SynchronousQueue队列;oKO28资讯网——每日最新资讯28at.com
oKO28资讯网——每日最新资讯28at.com
判断是否有空闲线程,如果有,就去取出任务执行;oKO28资讯网——每日最新资讯28at.com
oKO28资讯网——每日最新资讯28at.com
如果没有空闲线程,就新建一个线程执行;oKO28资讯网——每日最新资讯28at.com
oKO28资讯网——每日最新资讯28at.com
执行完任务的线程,还可以存活60s,如果在这期间接到任务,就可以继续活下去,否则被销毁。oKO28资讯网——每日最新资讯28at.com
oKO28资讯网——每日最新资讯28at.com
适用场景:oKO28资讯网——每日最新资讯28at.com
oKO28资讯网——每日最新资讯28at.com
用于并发执行大量短期的小任务。oKO28资讯网——每日最新资讯28at.com
oKO28资讯网——每日最新资讯28at.com
newScheduleThreadPool
public ScheduledThreadPoolExecutor(int corePoolSize) { super(corePoolSize, Integer.MAX_VALUE, 0, NANOSECONDS, new DelayedWorkQueue());}
线程池特点:oKO28资讯网——每日最新资讯28at.com
oKO28资讯网——每日最新资讯28at.com
最大线程数为Integer.MAX_VALUE,也有OOM风险oKO28资讯网——每日最新资讯28at.com
oKO28资讯网——每日最新资讯28at.com
阻塞队列是DelayedWorkQueueoKO28资讯网——每日最新资讯28at.com
oKO28资讯网——每日最新资讯28at.com
keepAliveTime为0oKO28资讯网——每日最新资讯28at.com
oKO28资讯网——每日最新资讯28at.com
scheduleAtFixedRate():按某种速率周期执行oKO28资讯网——每日最新资讯28at.com
oKO28资讯网——每日最新资讯28at.com
scheduleWithFixedDelay():在某个延迟后执行oKO28资讯网——每日最新资讯28at.com
oKO28资讯网——每日最新资讯28at.com
oKO28资讯网——每日最新资讯28at.com
oKO28资讯网——每日最新资讯28at.com
oKO28资讯网——每日最新资讯28at.com
工作机制:oKO28资讯网——每日最新资讯28at.com
oKO28资讯网——每日最新资讯28at.com
线程从DelayQueue中获取已到期的ScheduledFutureTask(DelayQueue.take())。到期任务是指ScheduledFutureTask的time大于等于当前时间。oKO28资讯网——每日最新资讯28at.com
oKO28资讯网——每日最新资讯28at.com
线程执行这个ScheduleFutureTaskoKO28资讯网——每日最新资讯28at.com
oKO28资讯网——每日最新资讯28at.com
线程修改ScheduledFutureTask的time变量为下次将要被执行的时间oKO28资讯网——每日最新资讯28at.com
oKO28资讯网——每日最新资讯28at.com
线程把这个修改time之后的ScheduledFutureTask放回DelayQueue中(DelayQueue.add())。oKO28资讯网——每日最新资讯28at.com
oKO28资讯网——每日最新资讯28at.com
oKO28资讯网——每日最新资讯28at.com
oKO28资讯网——每日最新资讯28at.com
oKO28资讯网——每日最新资讯28at.com
使用场景:oKO28资讯网——每日最新资讯28at.com
oKO28资讯网——每日最新资讯28at.com
周期性执行任务的场景,需要限制线程数量的场景。oKO28资讯网——每日最新资讯28at.com
oKO28资讯网——每日最新资讯28at.com
使用无界队列的线程池会导致什么问题:oKO28资讯网——每日最新资讯28at.com
例如newFixedThreadPool使用了无界的阻塞队列LinkedBlockingQueue,如果线程获取一个任务后,任务的执行时间比较长,会导致队列的任务越积越多,导致机器内存使用不停飙升,最终导致OOM。oKO28资讯网——每日最新资讯28at.com
本文链接:http://www.28at.com/showinfo-26-15863-0.html四种常见线程池的原理,你学会了吗?
声明:本网页内容旨在传播知识,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。邮件:2376512515@qq.com
上一篇: 使用Frida在Windows中拦截C++函数
下一篇: Kubernetes使用OkHttp客户端进行网络负载均衡