Java线程池系列--饱和策略(拒绝策略)的使用(有实例)
原文网址:Java线程池系列--饱和策略(拒绝策略)的使用(有实例)_IT利刃出鞘的博客-CSDN博客
简介
本文用示例介绍Java线程池的饱和策略(拒绝策略)。
概述
Java线程池的饱和策略如下:
饱和策略 |
说明 |
ThreadPoolExecutor.AbortPolicy |
线程池默认的阻塞策略。 不执行此任务,而且抛出一个运行时异常(未检查的异常RejectedExecutionException)。 切记:ThreadPoolExecutor.execute需要try catch,否则程序会直接退出。 |
ThreadPoolExecutor.DiscardPolicy |
不执行此任务,而且不抛异常。(是个空方法) |
ThreadPoolExecutor.DiscardOldestPolicy |
从队列里删除最老的任务(头部的一个任务),并再次execute 此task。 |
ThreadPoolExecutor.CallerRunsPolicy |
让调用execute方法的线程执行此command,会阻塞入口。 这是个调节机制,既不抛弃任务也不抛出异常,而是将某些任务回退到调用者,让调用者所在的线程去执行。 |
用户自定义拒绝策略(最常用) |
实现RejectedExecutionHandler,并自己定义策略模式 |
实例
package concurrency.pool;import java.util.concurrent.LinkedBlockingDeque;
import java.util.concurrent.RejectedExecutionHandler;
import java.util.concurrent.ThreadPoolExecutor;
import java.util.concurrent.TimeUnit;/*** Created by li on 2016/7/2.*/
public class SaturationPolicy {/*** 线程池工作队列已满时,在不同饱和策略下表现* @param handler 线程池工作队列饱和策略*/public static void policy(RejectedExecutionHandler handler){//基本线程2个,最大线程数为3,工作队列容量为5ThreadPoolExecutor exec = new ThreadPoolExecutor(2,3,0, TimeUnit.MILLISECONDS,new LinkedBlockingDeque<>(5));if (handler != null){exec.setRejectedExecutionHandler(handler);//设置饱和策略}for (int i = 0; i < 10; i++) {exec.submit(new Task());//提交任务}exec.shutdown();}//自定义任务static class Task implements Runnable {private static int count = 0;private int id = 0;//任务标识public Task() {id = ++count;}@Overridepublic void run() {try {TimeUnit.SECONDS.sleep(3);//休眠3秒} catch (InterruptedException e) {System.err.println("线程被中断" + e.getMessage());}System.out.println(" 任务:" + id + "\t 工作线程: "+ Thread.currentThread().getName() + " 执行完毕");}}public static void main(String[] args) {
// policy(new ThreadPoolExecutor.AbortPolicy());
// policy((new ThreadPoolExecutor.CallerRunsPolicy()));
// policy(new ThreadPoolExecutor.DiscardPolicy());
// policy(new ThreadPoolExecutor.DiscardOldestPolicy());}
}
1. Abort策略:默认策略。
新任务提交时直接抛出未检查的异常RejectedExecutionException,该异常可由调用者捕获。
在主函数中添加如下代码:
policy(new ThreadPoolExecutor.AbortPolicy());
运行结果:
程序抛出了RejectedExecutionException,并且一共运行了8个任务(线程池开始能运行3个任务,工作队列中存储5个队列)。当工作队列满了的时候,直接抛出了异常,而且JVM一直不退出(我现在也不知道什么原因)。我们可以看到执行任务的线程全是线程池中的线程。
2. Discard策略:抛弃新提交的任务
在main函数中运行
policy(new ThreadPoolExecutor.DiscardPolicy());
运行结果:
通过上面的结果可以显示:没有异常抛出,后面提交的2个新任务被抛弃,只处理了前8(3+5)个任务,JVM退出。
3. DiscardOldest策略
丢弃最老(队头)的任务,然后尝试提交新的任务。(不适合工作队列为优先队列场景)
在main函数中运行如下方法
policy(new ThreadPoolExecutor.DiscardOldestPolicy());
运行结果:一共运行8个任务,程序结束,后面添加的任务9,任务10被执行了,而前面的任务3,任务4被丢弃。
4. CallerRuns策略
在主函数运行:
policy((new ThreadPoolExecutor.CallerRunsPolicy()));
运行结果
所有的任务都被运行,且有2(10 - 3 -5)个任务是在main线程中执行成功的,8个任务在线程池中的线程执行的。
Java线程池系列--饱和策略(拒绝策略)的使用(有实例)相关推荐
- 《Java线程池》:任务拒绝策略
<Java线程池>:任务拒绝策略 转载:https://blog.csdn.net/u010412719/article/details/52132613 在没有分析线程池原理之前先来分析 ...
- Java 线程池 ThreadPoolExecutor 八种拒绝策略浅析
前言 谈到 Java 的线程池最熟悉的莫过于 ExecutorService 接口了,jdk1.5 新增的 java.util.concurrent 包下的这个 api,大大的简化了多线程代码的开发. ...
- 线程池的四种拒绝策略
一.前言 线程池,相信很多人都有用过,没用过相信的也有学习过.但是,线程池的拒绝策略,相信知道的人会少许多. 二.四种线程池拒绝策略 当线程池的任务缓存队列已满并且线程池中的线程数目达到maximum ...
- Java线程池系列--线程池的种类(Executors的用法)
原文网址:Java线程池系列--线程池的种类(Executors的用法)_IT利刃出鞘的博客-CSDN博客 简介 说明 线程池是Java多线程常用的技术,本文介绍线程池的种类,用示例介绍其用法. 相关 ...
- Java多线程学习七:线程池的 4 种拒绝策略和 6 种常见的线程池
以便在必要的时候按照我们的策略来拒绝任务,那么拒绝任务的时机是什么呢?线程池会在以下两种情况下会拒绝新提交的任务. 第一种情况是当我们调用 shutdown 等方法关闭线程池后,即便此时可能线程池内部 ...
- 线程池的 RejectedExecutionHandler(拒绝策略)
转载自 https://blog.csdn.net/jgteng/article/details/54411423 https://blog.csdn.net/luofenghan/article/ ...
- Java 线程池中的线程复用是如何实现的?
前几天,技术群里有个群友问了一个关于线程池的问题,内容如图所示: 关于线程池相关知识可以先看下这篇:为什么阿里巴巴Java开发手册中强制要求线程池不允许使用Executors创建? 那么就来和大家探讨 ...
- 面试官问:你做过什么Java线程池实践,我写了一篇博客给他看~
线程池大家都## 标题很熟悉,无论是平时的业务开发还是框架中间件都会用到,大部分都是基于JDK线程池ThreadPoolExecutor做的封装, 都会牵涉到这几个核心参数的设置:核心线程数,等待(任 ...
- java定长池,java线程池源码学习
使用Executors创建线程池 Executor是一个工厂类,可以直接创建线程池,从最简单的定长线程池开始学习 public static ExecutorService newFixedThrea ...
最新文章
- 教程 | 一文读懂自学机器学习的误区和陷阱(附学习资料)
- pytorch dropout用法
- 蓝桥杯_算法训练_最小乘积(基本型)
- jQuery实现购物车多物品数量的加减+总价计算
- 返回值由hresult变为void型_java高级之泛型
- 关于treeview中的checkbox的全选问题
- vue前期项目搭建所需要安装的插件,idea操作
- linux查看tongweb端口,东方通tongweb linux安装
- embedding lookup函数
- SpringBoot+Vue批量下载图片压缩包
- UVA 1359 POJ 3522 Slim Span(最小生成树kruskal)
- OpenWRT-Wifidog之利用Luci认证
- 模拟人脑:迄今最大规模4个实验,人工智能的救赎之路?(附PDF公号发“模拟人脑”下载)
- vba 发送邮件 html,VBA自动发送邮件+内容+附件
- Tampermonkey扩展下载
- 交通信号灯课程设计(红绿灯)
- c#语言编程:定义person类,再派生学生类如何存放学生的成绩,C#定义全班学生成绩类,包括姓名,学号,C++成绩,英语成绩,数学成绩,平均成绩...
- 计算机 发声原理,耳机 篇十五:动铁耳机发声原理哦。喜欢记得收藏。
- linux输入多行内容至文件
- DLL文件应该放在哪里?