あなたは間違った道を進んでいます。スレッド プールはスレッドを所有しており、それらをコードと共有すると、問題が発生する可能性があります。タスク (スレッドにキャンセル可能/割り込み可能に渡す) を作成する
ことに集中し、プールが所有するスレッドと直接対話しないようにする必要があります。
さらに、スレッドを中断しようとした時点で実行されているジョブがわからないため、なぜこれを行うことに関心があるのか わかりません
更新:
スレッド プールに送信されたタスクをキャンセルする適切な方法はFuture
、executor によって返されたタスクを使用することです。
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<Integer, InterruptableTask> tasks = new HashMap<Integer, InterruptableTask>();
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();
}