Java线程池在开发中的作用是不能忽视的,线程池是一种基于池化思想管理线程的工具,经常出现在多线程服务器中,如MySQL,用来创建和管理线程。那java线程池工厂方法是什么?接下来我们就来给大家讲解一下这方面的内容。
Executors:线程池的工具类,相当于一个工厂类,用来创建合适的线程池,返回ExecutorService类型的线程池,由java.util提供
分别是:缓存线程池、固定大小线程池、单线程线程池、可延时或定时执行的线程池
1.可缓存线程池:
//适用于大量短耗时任务和对响应时间要求较高的场景//允许的创建线程数量为 Integer.MAX_VALUE(无限),可能会创建大量的线程//添加任务时会优先使用空闲的线程,如果没有就创建一个新线程,线程数没有上限,所以每一个任务都会马上被分配到一个工作线程进行执行,不需要在阻塞队列中等待;//如果线程池长期闲置,那么其中的所有线程都会被销毁,节约系统资源。ExecutorService executorService=Executors.newCachedThreadPool();
(1)优点:
1.任务在添加后可以马上执行,不需要进入阻塞队列等待;
2.在闲置时不会保留线程,可以节约系统资源
(2)缺点:
对线程数没有限制,可能会过量消耗系统资源;
2.定长线程池:
//任务量峰值不会过高,且任务对响应时间要求不高的场景//定长线程池中的线程数会逐步增长到nThreads个,并且在之后空闲线程不会被释放,线程数会一直保持在nThreads个。//如果添加任务时所有线程都处于忙碌状态,那么就会把任务添加到阻塞队列中等待执行,阻塞队列中任务的总数没有上限。ExecutorService executorService=Executors.newFixedThreadPool(int nThreads)
(1)优点:线程数固定,对系统资源的消耗可控
(2)缺点:
1.任务量暴增的情况下线程池不会弹性增长,会导致任务完成时间延迟;
2.使用了无界队列,在线程数设置过小的情况下可能会导致过多的任务积压,引起任务完成时间过晚和资源被过度消耗的问题
3.延时任务线程池:
//可以提供延时执行、定时执行等功能//实现了ScheduledExecutorService接口,主要用于需要延时执行和定时执行的情况。ScheduledExecutorService executorService=Executors.newScheduledThreadPool(int corePoolSize);
(1)优点:可以提供延时执行、定时执行等功能
(2)特点:
1.最大线程数为无限,在任务量较大时可以创建大量新线程执行任务;
2.超时时间为0,线程空闲后会被立即销毁;
3.使用了延时工作队列,延时工作队列中的元素都有对应的过期时间,只有过期的元素才会被弹出;
4.单线程线程池:
//单线程线程池中只有一个工作线程,可以保证添加的任务都以指定顺序执行(先进先出、后进先出、优先级)ExecutorService executor =Executors.ScheduledThreadPool();
(1)优点:可以保证添加的任务都以指定顺序执行
(2)特点:
相比与手动创建线程:
1.可以通过共享的线程池很方便地提交任务进行异步执行,而不用自己管理线程的生命周期;
2.我们可以使用任务队列并指定任务的执行顺序,容易对任务进行管理
线程池工作是怎样的?
1. 线程池刚创建时,里面没有一个线程。任务队列是作为参数传进来的。不过,就算队列里面有任务,线程池也不会马上执行它们。
2. 当调用 execute() 方法添加一个任务时,线程池会做如下判断:
a) 如果正在运行的线程数量小于 corePoolSize,那么马上创建线程运行这个任务;
b) 如果正在运行的线程数量大于或等于 corePoolSize,那么将这个任务放入队列;
c) 如果这时候队列满了,而且正在运行的线程数量小于 maximumPoolSize,那么还是要
创建非核心线程立刻运行这个任务;
d) 如果队列满了,而且正在运行的线程数量大于或等于 maximumPoolSize,那么线程池
会抛出异常 RejectExecutionException。
3. 当一个线程完成任务时,它会从队列中取下一个任务来执行。
4. 当一个线程无事可做,超过一定的时间(keepAliveTime)时,线程池会判断,如果当前运
行的线程数大于 corePoolSize,那么这个线程就被停掉。所以线程池的所有任务完成后,它
最终会收缩到 corePoolSize 的大小。
使用线程池能够缩短了对任务的响应时间,并且还能避免了线程数量膨胀导致的过分调度问题,保证了对内核的充分利用。最后大家如果想要了解更多java入门知识,敬请关注奇Q工具网。
推荐阅读: