线程池知识点

您所在的位置:网站首页 五种线程池的分类和作用是什么意思 线程池知识点

线程池知识点

2024-07-11 10:14| 来源: 网络整理| 查看: 265

1.基础概念

线程池是内部维护、创建、管理线程的任务空间,在期内部维护了多个线程,当没有任务时,这些线程就处于空闲状态;当有任务分配时,线程池就会分配一个空闲线程执行该任务;当有任务且所有线程都在忙时,线程池就创建一个线程去执行该任务。

2.线程池的分类

Java标准库提供的几种常用线程池,创建这些线程池的方法都被封装到Executors中。

FixedThreadPool:线程数固定的线程池,线程池中的线程数量固定,不会随着任务的增加而增加,也不会随着任务的减少而减少。适用于处理CPU密集型的任务,确保CPU在长期被工作线程使用的情况下,尽可能少地分配线程,即适用于执行长期的任务。

线程池参数: ○ 核心线程数和最大线程数一致 ○ 非核心线程线程空闲存活时间,即keepAliveTime为0 ○ 阻塞队列为无界队列LinkedBlockingQueue ● 工作机制: a 提交线程任务 b 如果线程数少于核心线程,创建核心线程执行任务 c 如果线程数等于核心线程,把任务添加到LinkedBlockingQueue阻塞队列 d 如果线程执行完任务,去阻塞队列取任务,继续执行

CachedThreadPool:线程数根据任务动态调整的线程池,线程池中的线程数量可以根据需要进行动态调整,如果有空闲线程可用,则会重用空闲线程,如果没有可用线程,则会创建新的线程。适用于任务量不确定且任务执行时间较短的情况。

线程池参数: ○ 核心线程数为0 ○ 最大线程数为Integer.MAX_VALUE ○ 工作队列是SynchronousQueue同步队列 ○ 非核心线程空闲存活时间为60秒 ● 工作机制: a 提交线程任务 b 因为核心线程数为0,所以任务直接加到SynchronousQueue工作队列 c 判断是否有空闲线程,如果有,就去取出任务执行 d 如果没有空闲线程,就新建一个线程执行 e 执行完任务的线程,还可以存活60秒,如果在这期间,接到任务,可以继续存活下去;否则,被销毁。

SingleThreadExecutor:仅提供一个单线程的线程池,线程池中只有一个线程,所有的任务按照顺序依次执行。适用于需要保证任务按照顺序执行的情况。

线程池参数: ○ 核心线程数为1 ○ 最大线程数也为1 ○ 阻塞队列是LinkedBlockingQueue ○ 非核心线程空闲存活时间为0秒

ScheduledThreadPool:能实现定时、周期性任务的线程池,可以定时执行任务的线程池,可以指定任务的延迟时间和执行周期。适用于需要定时执行任务的情况。

线程池参数: ○ 最大线程数为Integer.MAX_VALUE ○ 阻塞队列是DelayedWorkQueue ○ keepAliveTime为0

3.线程池的创建与使用 3.1 线程池的重要参数 参数解释corePoolSize(线程池核心线程数)线程池维护的最小线程数量,核心线程创建后不会被回收。maximumPoolSize(线程池最大线程数)线程池允许创建的最大线程数量(包含核心线程数)keepAliveTime(非核心线程存活时间)当一个可被回收的线程空闲时间大于该值时,就会被回收TimeUnit(时间单位)keepAliveTime参数的单位,有hour,second等BlockingQueue(阻塞工作队列)用来存储等待执行的任务ThreadFactory(线程工厂)用于创建线程,以及自定义线程名称,需要实现ThreadFactory接口RejectExecutionHandler(拒绝策略)当线程池内的线程耗尽,并且工作队列达到已满时,新提交的任务,将使用拒绝策略 3.2 线程池的创建

 主要通过创建一个ThreadPoolExecutor对象来创建线程池,对于具体线程池的下:

//创建固定数量的线程池,参数表示创建拥有几个线程的线程池 ExecutorService executorService = Executors.newFixedThreadPool(4); //创建线程数根据任务动态调整的线程池 ExecutorService executorService = Executors.newCachedThreadPool(); //创建单线程的线程池 ExecutorService executorService = Executors.newSingleThreadExecutor(); //创建周期性任务的线程池 ExecutorService executorService = Executors.newScheduledThreadPool(0); 3.3 线程池的关闭

线程池的关闭有shutdown()和shutdownNow()两个方法,他们的区别是:

shutdown() :等待当前正在执行的任务完成后关闭shutdownNow():不论当前任务是否执行完毕,都立即关闭 3.4 线程池的常用方法 方法作用

void execute(Runnable command)

执行无返回值的线程任务Future submit(Callable task)提交有返回值的线程任务void shutdown()/shutdownNow()关闭线程池boolean awaitTermination(long timeout, TimeUnit unit)等待线程池关闭 3.5 线程池的使用 3.5.1 FixedThreadPool的使用 //固定数目的线程池 public class Demo2 { public static void main(String[] args) throws InterruptedException { //创建固定数目的线程池(线程池中有四个线程) ExecutorService executorService = Executors.newFixedThreadPool(4); //提交6个线程任务 for(int i = 0;i


【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3