次の作業例では、1〜20の整数で3秒ごとに出力します.2つのステータスフラグ(t1.getStatus、t2.getStatus)のいずれかがtrueの場合、プログラムは終了する必要があります。 t1.getStatus
がtrueの場合、スキャナが終了しないため、プログラムはまだ実行されています。割り込みスキャナは他のスレッドに依存します
public class Test {
public static void main(String[] args) {
FirstTask t1 = new FirstTask();
ScheduledExecutorService executor = Executors.newScheduledThreadPool(1);
executor.scheduleAtFixedRate(t1, 0, 3, TimeUnit.SECONDS);
ParallelScanner t2 = new ParallelScanner();
Thread scan = new Thread(t2);
scan.start();
while(true){
if(t1.getStatus() || t2.getStatus()) break;
}
scan.interrupt();
executor.shutdown();
}
}
class ParallelScanner implements Runnable {
private volatile boolean status=false;
public void run() {
Scanner scan = new Scanner(System.in);
String input = scan.nextLine();
System.out.println("scanner stoped");
scan.close();
this.status=true;
}
public boolean getStatus(){
return this.status;
}
}
class FirstTask implements Runnable {
private volatile boolean status=false;
public void run() {
this.status = status();
}
private boolean status() {
int incident = (int) ((Math.random()*20)+1);
System.out.println(incident);
return incident < 7 ? true : false;
}
public boolean getStatus() {
return this.status;
}
}
ステータスフラグを使用して割り込みを制御するには、間違ったスクラッチもあります。私も同様の質問hereを見つけました。今までの最初の答えは私をつかまえません。そして2番目の答えは間違っています。誰かがこのアプローチについて小さな実例を提供することができますか?他にもいくつかの選択肢がありますか?
キーワードvolatileのThx。コードを整理して、私の質問をもっと分かりやすくしてくれることを願っています。問題はまだ同じですから。 1~20の間に3秒ごとに番号を印刷します。これはエグゼキュータによって行われます。スキャナは別のスレッドでラップされています。しかし、 't1.getStatus'が真であれば、無限ループが壊れてもプログラムは終了しません。スキャナが入力を待っているためです。 –