2017-02-18 5 views
0

次の作業例では、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番目の答えは間違っています。誰かがこのアプローチについて小さな実例を提供することができますか?他にもいくつかの選択肢がありますか?

答えて

0

あなたのFirstTaskは1度しか実行されていないことが分かります。

ステータス変数volatileをすべてのスレッドがRAMから読み込むようにする必要があります。そうしないと、未定義の動作が発生します。

なぜあなたはスキャナを使用するループがありませんか?私はScannerクラスの詳細を知らないのですが、データがなくなると例外がスローされるのですか?またはコードが想定しているとおりにnullが返されますか?

for(;;){ 
    String input = scan.nextLine(); 
    if(input == null) 
     break; 
    // Assuming that by jump over (run through) you mean: 
    // ignore the line that comes from the scanner 
    if(!t1.getStatus()){ 
     System.out.println(input); 
    } 
} 

またあなたのgetStatus()メソッドは、trueにステータスをリセットする必要があるか、それはまた、(=印刷しない)すべての連続した行を無視します。

+0

キーワードvolatileのThx。コードを整理して、私の質問をもっと分かりやすくしてくれることを願っています。問題はまだ同じですから。 1~20の間に3秒ごとに番号を印刷します。これはエグゼキュータによって行われます。スキャナは別のスレッドでラップされています。しかし、 't1.getStatus'が真であれば、無限ループが壊れてもプログラムは終了しません。スキャナが入力を待っているためです。 –

関連する問題