ExecutorServiceには、すべてのスレッドを停止してサービスをシャットダウンするshutdownNowメソッドがあります。
編集:
私はshutdownNowので、私は私が思ったとして、それがスレッドを停止することはできません見るようにいくつかの実験を行いました。 AFAIK割り込み()を使用しますが、すべてのスレッドが割り込みに反応するわけではありません。
だから私が思い付くことができる最高の選択肢:
まず、インジケータクラスを作成します。あなたが開始
public static class Indicator{
private boolean isReady = false;
public void ready(){
isReady = true;
}
public boolean isReady(){
return isReady;
}
}
スレッドが通信する一つの指標インスタンスを共有する必要があります。 ですから、このような呼び出し可能な作成することができます:最初のスレッドは、それが他の人を停止することができ、彼らはhimselves後にクリーンアップする準備ができている
public static class Processor implements Callable<Integer> {
private volatile Indicator indicator;
private Integer number;
public Processor(Integer integer, Indicator isReady){
this.number = integer;
this.indicator = isReady;
}
@Override
public Integer call() throws Exception {
System.out.println("Thread started:" + Thread.currentThread().getId());
int counter = 0;
while (!indicator.isReady &&counter < number) {
// Make complicated things
Math.sin(counter);
counter++;
}
if(indicator.isReady){
//another thread finished
//delete resources
System.out.println("Thread interrupted: " + Thread.currentThread().getId() + " " + counter);
return -1;
} else {
System.out.println("Thread finished: " + Thread.currentThread().getId() + " " + counter);
indicator.ready();
return counter;
}
}
}
この道を。
次のように私はこれを試してみました:
public static void main(String[] args) throws ExecutionException, InterruptedException {
ExecutorService executorService = Executors.newCachedThreadPool();
List<Future<Integer>> clusterFutures = new ArrayList<>();
Indicator indicator = new Indicator();
clusterFutures.add(executorService.submit(new Processor(100, indicator)));
clusterFutures.add(executorService.submit(new Processor(10000, indicator)));
clusterFutures.add(executorService.submit(new Processor(10000000,indicator)));
}
にサンプル出力:
Thread started:11
Thread started:12
Thread finished: 11 100
Thread interrupted: 12 1001
Thread started:13
Thread interrupted: 13 0
追記:参照されるクラスは、ちょうど実験中に作るために簡単だった静的な内部クラスである必要はありませんが1つのファイル。コードの面では
ありがとう、もう一度ポイント。最終的には他のスレッドをシャットダウンするときに実行されるようなコードブロックを持つ方法がありますか?私は他の先物によってダウンロードされたファイルをきれいにする必要があります。 – user3539951