一、被拒绝的任务
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 { /** * 打印被拒绝的任务的名称和状态 */ @Override public 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; } @Override public 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); } @Override public 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 threadPoolExecutor Task Task -- 0: Starting Sending another Task... RejectedTaskController : The Task java.util.concurrent.FutureTask@5c647e05 has been rejected Task Task -- 0 : ReportGenerator : Generating a report during 7 seconds Task Task -- 2: Starting Task Task -- 2 : ReportGenerator : Generating a report during 5 seconds Task Task -- 1: Starting RejectedTaskController : 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 seconds RejectedTaskController : Terminating true RejectedTaskController : Terminated false Main : End Task Task -- 1 : Ending Task Task -- 2 : Ending Task Task -- 0 : Ending