一、在执行器中取消任务,使用 Future#cancel
Future<String> future = executor.submit(() -> "ok");
boolean isDone = future.cancel(true);
1.如果任务已经完成或者之前已经被取消,或者由于某种原因而不能被取消,那么方法将返回false,并且任务也不能被取消
2.如果任务在执行器中等待分配,那么任务将被取消,并且不会开始执行。如果任务已经执行,如果参数中为true那么任务将被取消
如果参数为false,那么不会取消已经执行的任务
二、在执行器中控制任务的完成
FutureTask 类提供了一个名为done的方法,允许在执行器中的任务执行结束之后,还可以执行一些代码,用来执行一些后期处理操作
FutureTask<String> futureTask = new FutureTask<String>(() -> "sdf") {
@Override
protected void done() {
System.out.print("在线程结束后处理");
}
};
executor.submit(futureTask);
三、处理被执行器拒绝的任务
如果执行器调用了shutdown() ,那么执行器只有等待正在运行的任务或者等待执行的任务结束后,才能真正的结束,
期间如果还有任务发给执行器,这个任务将被拒绝。
executor.setRejectedExecutionHandler(new RejectedExecutionHandler() {
@Override
public void rejectedExecution(Runnable runnable, ThreadPoolExecutor threadPoolExecutor) {
System.out.println("被拒绝后的任务将由该处理器,负责处理。否则将抛出RejectedExecutionException");
}
});