线程池(4)-参数-RejectedExecutionHandler
1.介绍
当线程池线程数大于最大线程数(maximumPoolSize)时,多余的任务,程序应该按照什么拒绝策略处理。
2.拒绝策略4个
AbortPolicy:丢弃任务,并抛出RejectedExecutionException异常(需要在调用线程处捕获异常,即执行submit线程处)
DiscardPolicy:丢弃任务,不抛出异常
DiscardOldestPolicy:丢弃等待队列最前面任务
CallerRunsPolicy:由调用线程处理该任务
3.示例
3.1.AbortPolicy捕获异常
public class RejectedAbortPolicy { static class MyRunnable implements Runnable {
private String jobName; MyRunnable(String jobName) {
this.jobName = jobName;
} @Override
public void run() {
try {
while (true) {
Thread.currentThread();
Thread.sleep();
System.err.println("当前线程:" + Thread.currentThread().getName() + " 当前任务:" + jobName);
}
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
} public static void main(String[] args) throws InterruptedException {
ExecutorService es = new ThreadPoolExecutor(, , , TimeUnit.SECONDS, new ArrayBlockingQueue<Runnable>(),
Executors.defaultThreadFactory(), new AbortPolicy());
es.submit(new MyRunnable("job-1"));
es.submit(new MyRunnable("job-2"));
es.submit(new MyRunnable("job-3"));
Thread.sleep();
try {
Future<?> f = es.submit(new MyRunnable("job-4"));
f.get();// 这一句永远执行不到
} catch (Exception e) {
System.err.println("job-4 submit Thread pool mistake");
}
}
}
3.2.DiscardOldestPolicy测试丢弃等待队列最前面任务
public class RejectedDiscardOldestPolicy {
static class MyRunnable implements Runnable {
private String jobName; MyRunnable(String jobName) {
this.jobName = jobName;
} public String getJobName(){
return jobName;
} @Override
public void run() {
try {
while (true) {
Thread.currentThread();
Thread.sleep();
System.err.println("当前线程:" + Thread.currentThread().getName() + " 当前任务:" + jobName);
}
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
} public static void main(String[] args) throws InterruptedException {
BlockingQueue<Runnable> workQueue = new ArrayBlockingQueue<Runnable>();
ExecutorService es = new ThreadPoolExecutor(, , , TimeUnit.SECONDS, workQueue,
Executors.defaultThreadFactory(), new ThreadPoolExecutor.DiscardOldestPolicy());
es.execute(new MyRunnable("job-1"));
es.execute(new MyRunnable("job-2"));
es.execute(new MyRunnable("job-3"));
Runnable firstRunnable = workQueue.poll();
System.err.println("submit job-3 检查队列当前 Runnable名称:" +((MyRunnable) firstRunnable).getJobName());
workQueue.add(firstRunnable); Thread.sleep();
es.execute(new MyRunnable("job-4"));
Runnable SecondRunnable = workQueue.poll();
System.err.println("submit job-4 检查队列当前 Runnable名称应该为job-4,实际为:" +((MyRunnable) SecondRunnable).getJobName());
workQueue.add(SecondRunnable);
}
}
3.3.CallerRunsPolicy主线程处理这个任务
public class RejectedCallerRunsPolicy {
static class MyRunnable implements Runnable {
private String jobName; MyRunnable(String jobName) {
this.jobName = jobName;
} public String getJobName(){
return jobName;
} @Override
public void run() {
try {
while (true) {
Thread.currentThread();
Thread.sleep();
System.err.println("当前线程:" + Thread.currentThread().getName() + " 当前任务:" + jobName);
}
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
} public static void main(String[] args) throws InterruptedException {
BlockingQueue<Runnable> workQueue = new ArrayBlockingQueue<Runnable>();
ExecutorService es = new ThreadPoolExecutor(, , , TimeUnit.SECONDS, workQueue,
Executors.defaultThreadFactory(), new ThreadPoolExecutor.CallerRunsPolicy());
es.execute(new MyRunnable("job-1"));
es.execute(new MyRunnable("job-2"));
es.execute(new MyRunnable("job-3")); Thread.sleep();
es.execute(new MyRunnable("job-4"));
}
}
线程池(4)-参数-RejectedExecutionHandler的更多相关文章
- 线程池ThreadPoolExecutor参数设置
线程池ThreadPoolExecutor参数设置 JDK1.5中引入了强大的concurrent包,其中最常用的莫过了线程池的实现ThreadPoolExecutor,它给我们带来了极大的方便,但同 ...
- Java线程池构造参数详解
在ThreadPoolExecutor类中有4个构造函数,最终调用的是如下函数: public ThreadPoolExecutor(int corePoolSize, int maximumPool ...
- ThreadPoolExecutor(线程池)的参数
构造函数 public ThreadPoolExecutor(int corePoolSize, int maximumPoolSize, long keepAliveTime, TimeUnit u ...
- 线程池ThreadPoolExecutor参数分析
概述 比如去火车站买票, 有7个(maximumPoolSize)售票窗口, 但只有3个(corePoolSize)窗口对外开放.那么对外开放的3个窗口称为核心线程数, 而最大线程数是7个窗口. 如果 ...
- 线程池(3)-参数-实现ThreadFactory
1.介绍 ThreadFactory用来创建线程,需要实现newThread方法. 2.常用场景 线程重命名 设置守护进程 设置优先级 3.示例(线程重命名) public class ThreadF ...
- ThreadPoolExecutor线程池参数设置技巧
一.ThreadPoolExecutor的重要参数 corePoolSize:核心线程数 核心线程会一直存活,及时没有任务需要执行 当线程数小于核心线程数时,即使有线程空闲,线程池也会优先创建新线 ...
- Java线程池使用和常用参数
多线程问题: 1.java中为什么要使用多线程使用多线程,可以把一些大任务分解成多个小任务来执行,多个小任务之间互不影像,同时进行,这样,充分利用了cpu资源. 2.java中简单的实现多线程的方式 ...
- Java线程池参数
关于Java线程池的参数设置.线程池是Java多线程里开发里的重要内容,使用难度不大,但如何用好就要明白参数的含义和如何去设置.干货里的内容大多是参考别人的,加入了一些知识点的扩充和看法.希望能对多线 ...
- java中的线程(3):线程池类 ThreadPoolExecutor「线程池的类型、参数、扩展等」
官方文档: https://docs.oracle.com/javase/7/docs/api/java/util/concurrent/ThreadPoolExecutor.html 1.简介 pu ...
随机推荐
- idea全局护眼色绿豆沙
1.settings->plugins->BackgroundImage 2.在导航栏选择Help->FindAction 3.set background image 4.选择图片 ...
- jupyter安装出现问题:安装后无法打开
jupyter安装出现问题:安装后无法打开 traitlets.traitlets.TraitError: Could not decode 'C:\Users\\xce\xa2\xcc\xf0\xd ...
- django路由的反向解析
什么是路由的反向解析 我们的路由都是一个匹配关系,对应一个处理的视图函数, 如果我们的匹配关系发生了变化,那么与之对应的访问地址(可能前端直接url链接, 也可能是后端的redrict跳转)都需要跟着 ...
- 下载css-loader 安装及使用
1.通过require的方式来引入css,我们来看具体的方法,首先需要安装css-loader, style-loader(安装style-loader的目的是为了在html中以style的方式嵌入c ...
- Jmeter学习笔记(十三)——xpath断言
1.什么是XPath断言 XPath即为XML路径语言,它是一种用来确定XML(标准通用标记语言的子集)文档中某部分位置的语言.XPath基于XML的树状结构,提供在数据结构树中找寻节点的能力. Ap ...
- OC与swift混编 #import "项目名-Swift.h"失效问题
由于项目多个环境部署,每次改配置比较麻烦,所以线上环境一个TARGETS,内部环境一个TARGETS, 都知道oc和swift混编的时候,会生成一个'项目名-Swift.h'文件,这个文件是隐式的,需 ...
- ABAP开发环境终于支持以驼峰命名法自动格式化ABAP变量名了
Jerry进入SAP成都研究院前,一直是用C/C++开发,所以刚接触ABAP,对于她在某些语法环境下大小写敏感,某些环境下不敏感的特性很不适应.那时候Jerry深深地怀念之前在C/C++编程时遵循的驼 ...
- 导出带图片的Excel——OOXML文件分析
需求: 普通js导出文件excel具有兼容性问题,通过js-xsl导出文件API未找到导出图片的方案,实例过少,因此针对07年后以.xlsx后缀的excel文件,通过修改后缀.zip参考文件模板来实现 ...
- iview 标题内边距过大; 调整iview 单元格内边距、行高;
1css代码: /*调整table cell间隔和行高*/ .ivu-table-cell { padding-left: 1px; padding-right: 1px; } .ivu-table- ...
- 二十三、mysql索引管理详解
一.索引分类 分为聚集索引和非聚集索引. 聚集索引 每个表有且一定会有一个聚集索引,整个表的数据存储在聚集索引中,mysql索引是采用B+树结构保存在文件中,叶子节点存储主键的值以及对应记录的数据,非 ...