正如约翰所指出的,最好能让你的任务中断。然后,您可以简单地依赖ThreadPoolExecutor来中断所有工作线程,以便进行有序的取消。
如果这是不可能的,您可以在ThreadPoolExecutor中添加额外的逻辑来实现您想要的。这有点牵扯进来,对某些人来说可能不太好看(可能会影响性能),但我认为这会完成任务。我认为基本上你需要自己维护一个活动任务列表。关键是重写beforeExecute()和afterExecute()方法:
public class MyExecutor extends ThreadPoolExecutor {
private final Queue<RunnableFuture> activeTasks =
new LinkedBlockingQueue<RunnableFuture>();
...
protected void beforeExecute(Thread t, Runnable r) {
RunnableFuture task = (RunnableFuture)r;
activeTasks.add(task);
}
protected void afterExecute(Thread t, Runnable r) {
RunnableFuture task = (RunnableFuture)r;
activeTasks.remove(task);
}
public void cancelAllActiveTasks() {
for (RunnableFuture f: activeTasks) {
f.cancel(true); // invokes your custom cancellation logic
}
}