你在错误的轨道上。线程池拥有线程并通过与您的代码共享它们可能会搞砸了。
您应该关注将您的任务(传递给线程可取消/可中断),并且不直接与池拥有的线程进行交互。
此外,您不会不知道被你尝试中断线程时执行什么样的工作,所以我不明白为什么你有兴趣做这个
更新:
的正确方法取消您在线程池中提交的任务是通过Future执行程序返回的任务。
1)通过这种方式,你可以肯定地知道你实际上瞄准的任务试图取消
2)如果你的任务已经被设计成可以取消的话那么你的中途就是一半
3)不要使用标志指示取消,但使用Thread.currentThread().interrupt()代替
更新:
public class InterruptableTasks {
private static class InterruptableTask implements Runnable{
Object o = new Object();
private volatile boolean suspended = false;
public void suspend(){
suspended = true;
}
public void resume(){
suspended = false;
synchronized (o) {
o.notifyAll();
}
}
@Override
public void run() {
while(!Thread.currentThread().isInterrupted()){
if(!suspended){
//Do work here
}
else{
//Has been suspended
try {
while(suspended){
synchronized(o){
o.wait();
}
}
}
catch (InterruptedException e) {
}
}
}
System.out.println("Cancelled");
}
}
/**
* @param args
* @throws InterruptedException
*/
public static void main(String[] args) throws InterruptedException {
ExecutorService threadPool = Executors.newCachedThreadPool();
InterruptableTask task = new InterruptableTask();
Map tasks = new HashMap();
tasks.put(1, task);
//add the tasks and their ids
Future> f = threadPool.submit(task);
TimeUnit.SECONDS.sleep(2);
InterruptableTask theTask = tasks.get(1);//get task by id
theTask.suspend();
TimeUnit.SECONDS.sleep(2);
theTask.resume();
TimeUnit.SECONDS.sleep(4);
threadPool.shutdownNow();
}