RejectedExecutionHandler
来源:互联网 发布:linux下切换oracle命令 编辑:程序博客网 时间:2024/06/08 20:33
执行者控制被拒绝的任务
当你想要结束执行者的执行,你使用shutdown()方法来表明它的结束。执行者等待正在运行或等待它的执行的任务的结束,然后结束它们的执行。
如果你在shutdown()方法和执行者结束之间,提交任务给执行者,这个任务将被拒绝,因为执行者不再接收新的任务。ThreadPoolExecutor类提供一种机制,在调用shutdown()后,不接受新的任务。
在这个指南中,你将学习如何通过实现RejectedExecutionHandler,在执行者中管理拒绝任务。
准备工作…
这个指南的例子使用Eclipse IDE实现。如果你使用Eclipse或其他IDE,如NetBeans,打开它并创建一个新的Java项目。
如何做…
按以下步骤来实现的这个例子:
1.创建RejectedTaskController类,实现RejectedExecutionHandler接口。实现这个接口的rejectedExecution()方法。写入被拒绝任务的名称和执行者的名称与状态到控制台。
1
public
class
RejectedTaskController
implements
2
RejectedExecutionHandler {
3
@Override
4
public
void
rejectedExecution(Runnable r, ThreadPoolExecutor executor) {
5
System.out.printf(
"RejectedTaskController: The task %s has been rejected\n"
,r.toString());
6
System.out.printf(
"RejectedTaskController: %s\n"
,executor.toString());
7
System.out.printf(
"RejectedTaskController: Terminating:%s\n"
,executor.isTerminating());
8
System.out.printf(
"RejectedTaksController: Terminated:%s\n"
,executor.isTerminated());
9
}
2.实现Task类,实现Runnable接口。
1
public
class
Task
implements
Runnable{
3.声明私有的、String类型的属性name, 用来存储任务的名称。
1
private
String name;
4.实现这个类的构造器,初始化这个类的属性。
1
public
Task(String name){
2
this
.name=name;
3
}
5.实现run()方法,写入信息到控制台,表明这个方法开始执行。
1
@Override
2
public
void
run() {
3
System.out.println(
"Task "
+name+
": Starting"
);
6.等待一段随机时间。
1
try
{
2
long
duration=(
long
)(Math.random()*
10
);
3
System.out.printf(
"Task %s: ReportGenerator: Generating a report during %d seconds\n"
,name,duration);
4
TimeUnit.SECONDS.sleep(duration);
5
}
catch
(InterruptedException e) {
6
e.printStackTrace();
7
}
7.写入信息到控制台,表明方法的结束。
1
System.out.printf(
"Task %s: Ending\n"
,name);
2
}
8.重写toString()方法,返回任务的名称。
1
public
String toString() {
2
return
name;
3
}
9.实现这个示例的主类,通过创建Main类,并实现main()方法。
1
public
class
Main {
2
public
static
void
main(String[] args) {
10.创建一个RejectedTaskController对象,管理拒绝的任务。
1
RejectecTaskController controller=
new
RejectecTaskController();
11.使用Executors类的newCachedThreadPool()方法,创建ThreadPoolExecutor。
1
ThreadPoolExecutor executor=(ThreadPoolExecutor) Executors.newCachedThreadPool();
12.建立执行者的拒绝任务控制器。
1
executor.setRejectedExecutionHandler(controller);
13.创建任务并提交它们给执行者。
1
System.out.printf(
"Main: Starting.\n"
);
2
for
(
int
i=
0
; i<
3
; i++) {
3
Task task=
new
Task(
"Task"
+i);
4
executor.submit(task);
5
}
14.使用shutdown()方法,关闭执行者。
1
System.out.printf(
"Main: Shutting down the Executor.\n"
);
2
executor.shutdown();
15.创建其他任务并提交给执行者。
1
System.out.printf(
"Main: Sending another Task.\n"
);
2
Task task=
new
Task(
"RejectedTask"
);
3
executor.submit(task);
16.写入信息到控制台,表明程序结束。
1
System.out.println(
"Main: End"
);
2
System.out.printf(
"Main: End.\n"
);
这是如何工作的…
以下截图显示示例的执行结果:
你可以看出当执行者关闭时,任务被拒绝提交。RejectecTaskController将有关于任务和执行者的信息写入到控制台。
为了管理执行者控制拒绝任务,你应该实现RejectedExecutionHandler接口。该接口有带有两个参数的方法rejectedExecution():
- Runnable对象,存储被拒绝的任务
- Executor对象,存储拒绝任务的执行者
每个被执行者拒绝的任务都会调用这个方法。你必须使用Executor类的setRejectedExecutionHandler()方法设置拒绝任务的处理器。
不止这些…
当执行者接收任务时,会检查shutdown()是否已经被调用了。如果被调用了,它拒绝这个任务。首先,它查找 setRejectedExecutionHandler()设置的处理器。如果有一个(处理器),它调用那个类的 rejectedExecution()方法,否则,它将抛RejectedExecutionExeption异常。这是一个运行时异常,所以你不需要 用catch语句来控制它。
- RejectedExecutionHandler
- RejectedExecutionHandler
- Java 之ThreadPoolExecutor.RejectedExecutionHandler
- ThreadPoolExecutor中的RejectedExecutionHandler浅析
- Java Executor并发框架 RejectedExecutionHandler
- 关于ThreadPoolExecutor 调用RejectedExecutionHandler的机制
- 线程池.(Executors,ThreadPoolExecutor,BlockingQueue,RejectedExecutionHandler).介绍
- 线程池的RejectedExecutionHandler(拒绝策略)
- java多线程-ThreadPoolExecutor的拒绝策略RejectedExecutionHandler
- Java 线程池 拒绝策略 RejectedExecutionHandler介绍
- JDK7中ThreadFactory和RejectedExecutionHandler源码概述
- Java Executor并发框架(二)RejectedExecutionHandler介绍
- 并发编程--线程池拒绝策略RejectedExecutionHandler(三)
- Java线程(八):ThreadPoolExecutor、RejectedExecutionHandler
- spring 线程池配置(corePoolSize,maxPoolSize,queueCapacity,keepAliveSeconds,rejectedExecutionHandler)
- Android线程池(二)——ThreadPoolExecutor及其拒绝策略RejectedExecutionHandler使用示例
- ThreadPoolExecutor自定义RejectedExecutionHandler当队列满时改为调用BlockingQueue. put来实现生产者的阻塞
- 解决Github安装缓慢问题
- Python-OpenCV 处理图像:图像中边界和轮廓检测
- spring xml 例子
- js查询ip地址归属地
- ubuntu 下samba 挂载问题
- RejectedExecutionHandler
- 1996年分区联赛提高组之四 砝码称重
- 大话数据结构十:字符串的模式匹配(BF算法)
- mysql基本操作指令(一)
- UVA11988(破损键盘) 使用数组模拟链表插入
- 浅谈“用力不用脑“
- PTA 数据结构与算法题目集(中文)5-3 树的同构 (25分)
- SparseArray替代HashMap来提高性能
- 云主机挂盘步骤