2016-12-05 13 views
0

キーを押してスレッドを一時停止して再開したい。アイデアは、スレッドがパイプを介して別のスレッドに送信される数値を生成し、ユーザーがキー 'p'を押してスレッドを一時停止して再開できることです。私は現時点でこれを持っています:スレッドは、任意のキーを押し、乱数が画面に表示されるまで待っています(出力は別のスレッドです)、スレッドは別のキーを押すまで待機しますが、 'p 'スレッドが停止し、私はそれを再開することができません。キーを押してスレッドを一時停止して再開する

import java.io.IOException; 
import java.util.Random; 
import java.io.PipedOutputStream; 
import java.util.Scanner; 


public class Producer extends Thread { 
    private static final int MIN = 0; 
    private static final int MAX = 60; 
    private volatile boolean pause; 
    private PipedOutputStream output = new PipedOutputStream(); 

public Producer(PipedOutputStream output) { 
    this.output = output; 
} 

@Override 
public void run() { 
    Random rand = new Random(); 

    Scanner reader = new Scanner(System.in); 
    int random; 
    String key = "p"; 
    String keyPressed; 
    try {  
     while (true) { 
      keyPressed = reader.next(); 
      if (keyPressed.equalsIgnoreCase(key)) { 
       pauseThread(); 
      } else { 
       random = rand.nextInt(MAX - MIN + 1); 
       output.write((int) random); 
       output.flush(); 
       Thread.sleep(1000); 

      } 
      if (pause = true && keyPressed.equalsIgnoreCase(key)) { 
        resumeThread(); 
      } 
     } 
     output.close(); 
    } catch (InterruptedException ex) { 
     interrupt(); 
    } catch (IOException ex) { 
     System.out.println("Could not write to pipe."); 
    } 
} 

public synchronized void pauseThread() throws InterruptedException { 
    pause = true; 
    while (pause) 
     wait(); 
} 

public synchronized void resumeThread() throws InterruptedException { 
    while (pause) { 
     pause = false; 
    } 
    notify(); 
} 

}

+0

大丈夫です。質問は何ですか? – Jobin

+0

この方法ではいけません。あなたのスレッドに 'BlockingQueue'を渡して、それを通してすべての番号をプッシュさせます。キューからの読み取りを中止して、プロセスを一時停止することができます。 – OldCurmudgeon

+0

また、あなたは試みることができますhttp://stackoverflow.com/a/10669623/823393 – OldCurmudgeon

答えて

0

おそらく一時停止されたスレッドは、キーボードを読むべきものではありません。

0

コメントpauseThread()内部run もちろん、resumeThreadはこれらの方法が必要でないためコメントする必要があります。私はあなたがprss 'p' uのときにあなたに主要な方法をスキップする必要があることを意味します。

関連する問題