Java并发编程-22-处理在执行器中被拒绝的任务

来源:互联网 发布:js onload是什么事件 编辑:程序博客网 时间:2024/06/16 08:25

一、被拒绝的任务

1、当我们想结束执行器的执行时,调用shutDown()方法

2、但是,执行器只有等待正在运行的任务或者等待执行任务结束之后,才能真正结束

3、如果在执行器shutDown()之后,发送一个任务给执行器,这个任务会被拒绝


二、RejectedExecutionHandler接口

这个接口只有一个方法

void rejectedExecution(Runnable r, ThreadPoolExecutor executor);

三、测试代码

package com.concurrency.executor;import java.util.concurrent.RejectedExecutionHandler;import java.util.concurrent.ThreadPoolExecutor;/** * 实现RejectedExecutionHandler接口 * @author Nicholas * *实现rejectedExecution方法 */public class RejectedTaskController implements RejectedExecutionHandler {/** * 打印被拒绝的任务的名称和状态 */@Overridepublic void rejectedExecution(Runnable r, ThreadPoolExecutor executor) {System.out.printf("RejectedTaskController : The Task %s has been rejected\n",r.toString());System.out.printf("RejectedTaskController : The status of the executor is %s\n",executor.toString());System.out.printf("RejectedTaskController : Terminating %s\n",executor.isTerminating());System.out.printf("RejectedTaskController : Terminated %s\n",executor.isTerminated());}}

package com.concurrency.executor;import java.util.concurrent.TimeUnit;public class Task implements Runnable {private String name;public Task(String name) {this.name = name;}@Overridepublic void run() {System.out.println("Task " + name + ": Starting");try {long duration = (long) (Math.random() * 10);System.out.printf("Task %s : ReportGenerator : Generating a report during %d seconds\n",name, duration);TimeUnit.SECONDS.sleep(duration);} catch (InterruptedException e) {e.printStackTrace();}System.out.printf("Task %s : Ending \n", name);}@Overridepublic String toString() {return name;}}

package com.concurrency.executor;import java.util.concurrent.Executors;import java.util.concurrent.ThreadPoolExecutor;public class Main {public static void main(String[] args) {RejectedTaskController rejectedTaskController = new RejectedTaskController();ThreadPoolExecutor threadPoolExecutor = (ThreadPoolExecutor) Executors.newCachedThreadPool();//设置rejectedTaskController对象来管理被拒绝的任务threadPoolExecutor.setRejectedExecutionHandler(rejectedTaskController);System.out.println("Main : starting \n");for (int i = 0; i < 3; i++) {Task task = new Task("Task -- " + i);threadPoolExecutor.submit(task);}System.out.println("Main : Shutting down the threadPoolExecutor");threadPoolExecutor.shutdown();//设置用于被拒绝的任务的处理System.out.println("Sending another Task...");Task task = new Task("RejectedTask");threadPoolExecutor.submit(task);System.out.println("Main : End");}}

打印的结果:

Main : starting Main : Shutting down the threadPoolExecutorTask Task -- 0: StartingSending another Task...RejectedTaskController : The Task java.util.concurrent.FutureTask@5c647e05 has been rejectedTask Task -- 0 : ReportGenerator : Generating a report during 7 secondsTask Task -- 2: StartingTask Task -- 2 : ReportGenerator : Generating a report during 5 secondsTask Task -- 1: StartingRejectedTaskController : The status of the executor is java.util.concurrent.ThreadPoolExecutor@1540e19d[Shutting down, pool size = 3, active threads = 3, queued tasks = 0, completed tasks = 0]Task Task -- 1 : ReportGenerator : Generating a report during 2 secondsRejectedTaskController : Terminating trueRejectedTaskController : Terminated falseMain : EndTask Task -- 1 : Ending Task Task -- 2 : Ending Task Task -- 0 : Ending 


0 0
原创粉丝点击