Java线程池ThreadPoolExecutor

int maximumPoolSize,

必看视频!获取2024年最新Java开发全套学习资料 备注Java

//当线程池中空闲线程数量超过corePoolSize时,多余的线程会在多长时间内被销毁。

long keepAliveTime,

//keepAliveTime的单位。

TimeUnit unit,

/**

  • 任务队列,

  • 被添加到线程池中,但尚未被执行的任务;

  • 它一般分为直接提交队列、有界任务队列、无界任务队列、优先任务队列几种;

*/

BlockingQueue workQueue,

/**

*线程工厂,用于创建线程,一般用默认即可。

*/

ThreadFactory threadFactory,

//自定义拒绝策略。当任务太多时如何拒绝任务。

RejectedExecutionHandler handler

)

参数说明补充:

handler:通过这个参数你可以自定义任务的拒绝策略。如果线程池中所有的线程都在忙碌,并且工作队列也满了(前提是工作队列是有界队列),那么此时提交任务,线程池就会拒绝接收。至于拒绝的策略, 你可以通过handler这个参数来指定。ThreadPoolExecutor已经提供了以下4种策略。

  • CallerRunsPolicy:提交任务的线程自己去执行该任务。(推荐使用)
  • AbortPolicy:默认的拒绝策略,会throws RejectedExecutionException
  • DiscardPolicy:直接丢弃任务,没有任何异常抛出。
  • DiscardOldestPolicy:丢弃最老的任务,其实就是把最早进入工作队列的任务丢弃,然后把新任务加入 到工作队列。

缓冲队列

  • BlockingQueue 是双缓冲队列。BlockingQueue 内部使用两条队列,允许两个线程同
时向队列一个存储,一个取出操作。在保证并发安全的同时,提高了队列的存取效率。
  • ArrayBlockingQueue:规定大小的BlockingQueue,其构造必须指定大小。其所含
的对象是FIFO 顺序排序的。
  • LinkedBlockingQueue:大小不固定的BlockingQueue,若其构造时指定大小,生
成的BlockingQueue 有大小限制,不指定大小,其大小有Integer.MAX\_VALUE 来  
决定。其所含的对象是FIFO 顺序排序的。
  • PriorityBlockingQueue:类似于LinkedBlockingQueue,但是其所含对象的排序不
是FIFO,而是依据对象的自然顺序或者构造函数的Comparator 决定。
  • SynchronizedQueue:特殊的BlockingQueue,对其的操作必须是放和取交替完成。

重要属性和方法

在这里插入图片描述

详情:https://www.cnblogs.com/dafanjoy/p/9729358.html

ThreadPoolExecutor提供的3个submit()方法和1个FutureTask工具类来支持获得执行任务执行结果的需求:

// 提交Runnable任务

Future<?> submit(Runnable task);

// 提交Callable任务

Future submit(Callable task);

// 提交Runnable任务及结果引⽤

Future submit(Runnable task, T result);

  1. 提交Runnable任务submit(Runnable task) :这个方法的参数是一个Runnable接口,Runnable接扣的run()方法是没有返回值的,所以 submit(Runnable task) 这个方法返回的Future仅可以用来断言任务已经结束了,类似于Thread.join()。

  2. 提交Callable任务 submit(Callable task):这个方法的参数是一个Callable接口,它只有一个 call()方法,并且这个方法是有返回值的,所以这个方法返回的Future对象可以通过调用其get()方法来获取任务的执行结果。

  3. 提交Runnable任务及结果引用 submit(Runnable task, T result):这个方法很有意思,假设这个方法返回的Future对象是f,f.get()的返回值就是传给submit()方法的参数result。Runnable接口的实现类Task声明了一个有 参构造函数 Task(Result r) ,创建Task对象的时候传入了result对象,这样就能在类Task的run()方法 中对result进行各种操作了。result相当于主线程和子线程之间的桥梁,通过它主子线程可以共享数据。

常用方法:

在ThreadPoolExecutor类中有几个非常重要的方法:

execute()

submit()

shutdown()

shutdownNow()

execute()方法实际上是Executor中声明的方法,在ThreadPoolExecutor进行了具体的实现,这个方法是ThreadPoolExecutor的核心方法,通过这个方法可以向线程池提交一个任务,交由线程池去执行。

submit()方法是在ExecutorService中声明的方法,在AbstractExecutorService就已经有了具体的实现,在ThreadPoolExecutor中并没有对其进行重写,这个方法也是用来向线程池提交任务的,但是它和execute()方法不同,它能够返回任务执行的结果,去看submit()方法的实现,会发现它实际上还是调用的execute()方法,只不过它利用了Future来获取任务执行结果(Future相关内容将在下一篇讲述)。

shutdown()和shutdownNow()是用来关闭线程池的。

使用并发工具包Executors创建线程池(不建议使用)

//创建一个可缓存线程池,如果线程池长度超过处理需要,可灵活回收空闲线程,若无可回收,则新建线程。

ExecutorService executor1 = Executors.newCachedThreadPool();

//创建一个定长线程池,可控制线程最大并发数,超出的线程会在队列中等待。

ExecutorService executor2 = Executors.newFixedThreadPool(10);

//创建一个定长线程池,支持定时及周期性任务执行。

ExecutorService executor3 = Executors.newScheduledThreadPool (10);

最后

由于细节内容实在太多了,为了不影响文章的观赏性,只截出了一部分知识点大致的介绍一下,每个小节点里面都有更细化的内容!

小编准备了一份Java进阶学习路线图(Xmind)以及来年金三银四必备的一份《Java面试必备指南》

由于细节内容实在太多了,为了不影响文章的观赏性,只截出了一部分知识点大致的介绍一下,每个小节点里面都有更细化的内容!

[外链图片转存中…(img-UGoQqRJy-1716465056432)]

小编准备了一份Java进阶学习路线图(Xmind)以及来年金三银四必备的一份《Java面试必备指南》

[外链图片转存中…(img-GRTA61tU-1716465056433)]

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值