java线程池工厂方法是什么?线程池工作是怎样的?

Java线程池在开发中的作用是不能忽视的,线程池是一种基于池化思想管理线程的工具,经常出现在多线程服务器中,如MySQL,用来创建和管理线程。那java线程池工厂方法是什么?接下来我们就来给大家讲解一下这方面的内容。

java线程池工厂方法.jpg

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工具网。

推荐阅读:

java线程池工作流程是什么?java线程池如何创建?

Java中只写算式会报错吗?Java程序运行流程是什么?

qt软件安装步骤是什么?安装之后怎么创建项目?