线程池(Thread Pool) 是并行执行任务收集的实用工具。随着 CPU 引入适合于应用程序并行化的多核体系结构,线程池的作用正日益显现。通过 ThreadPoolExecutor类及其他辅助类,Java 5 引入了这一框架,作为新的并
线程池(Thread Pool) 是并行执行任务收集的实用工具。随着 CPU 引入适合于应用程序并行化的多核体系结构,线程池的作用正日益显现。通过 ThreadPoolExecutor类及其他辅助类,Java 5 引入了这一框架,作为新的并发支持部分。
ThreadPoolExecutor框架灵活且功能强大,它支持特定于用户的配置并提供了相关的挂钩(hook)和饱和策略来处理满队列
Java线程池会将提交的任务先置于工作队列中,在从工作队列中获取(SynchronousQueue直接由生产者提交给工作线程)。那么工作队列就有两种实现策略:无界队列和有界队列。无界队列不存在饱和的问题,但是其问题是当请求持续高负载的话,任务会无脑的加入工作队列,那么很可能导致内存等资源溢出或者耗尽。而有界队列不会带来高负载导致的内存耗尽的问题,但是有引发工作队列已满情况下,新提交的任务如何管理的难题,这就是线程池工作队列饱和策略要解决的问题。
饱和策略分为:Abort 策略, CallerRuns 策略,Discard策略,DiscardOlds策略。
为了更好的理解,我编写一个小的例子。
package concurrency.pool;import java.util.concurrent.LinkedBlockingDeque;import java.util.concurrent.RejectedExecutionHandler;import java.util.concurrent.ThreadPoolExecutor;import java.util.concurrent.TimeUnit;public class SaturationPolicy {public static void policy(RejectedExecutionHandler handler){//基本线程2个,最大线程数为3,工作队列容量为5ThreadPoolExecutor exec = new ThreadPoolExecutor(2,3,0l, TimeUnit.MILLISECONDS,new LinkedBlockingDeque<>(5));if (handler != null){exec.setRejectedExecutionHandler(handler);//设置饱和策略}for (int i = 0; i < 10; i++) {exec.submit(new Task());//提交任务}exec.shutdown();}public static void main(String[] args) {// policy(new ThreadPoolExecutor.AbortPolicy());// policy((new ThreadPoolExecutor.CallerRunsPolicy()));// policy(new ThreadPoolExecutor.DiscardPolicy());// policy(new ThreadPoolExecutor.DiscardOldestPolicy());}//自定义任务static class Task implements Runnable {private static int count = 0;private int id = 0;//任务标识public Task() {id = ++count;}@Override public void run() {try {TimeUnit.SECONDS.sleep(3);//休眠3秒}catch (InterruptedException e) {System.err.println("线程被中断" + e.getMessage());}System.out.println(" 任务:" + id + "\t 工作线程: "+ Thread.currentThread().getName() + " 执行完毕");}}}
--结束END--
本文标题: java线程池工作队列饱和策略代码示例
本文链接: https://www.lsjlt.com/news/221110.html(转载时请注明来源链接)
有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341
下载Word文档到电脑,方便收藏和打印~
2024-05-15
2024-05-15
2024-05-15
2024-05-15
2024-05-15
2024-05-15
2024-05-15
2024-05-15
2024-05-15
2024-05-15
回答
回答
回答
回答
回答
回答
回答
回答
回答
回答
0