3

2 つのスレッドを次々と開始しています。最初のスレッドは入力からループを読み取り、もう 1 つのスレッドはループ内の条件をチェックして、別のスレッドに割り込みを送信します。

問題は、私が最初に開始した2つのスレッドが、もう一方を停止させないことです。読み込みを開始すると、終了するまで他のスレッドを実行しません。他のスレッドを開始すると、ループ内の条件がチェックされ、条件が真になってループから出るまでコードが進みません。それを行う正しい方法は何ですか?以下のサンプルコード:

スレッド 1)

public class InterruptionThread extends Thread {
   public void run() {

      while (condition not true) {
         try {
            sleep(1000);
         } catch (InterruptedException e) {
            e.printStackTrace();
         }

      }
      if (condition true) {
         do some work
         return;
      }
   }
}

スレッド 2)

public class ReadingThread extends Thread{

   public void run() {
      int input;
      while (true) {
         try {
            input = stdInput.read();
         } catch (IOException e) {
            e.printStackTrace();
            return;
         }
         System.out.print((char) input);
      }
   }
}
4

2 に答える 2

5

これは、スレッドを正しい方法で開始していないようです。

メソッドではなく、メソッドを使用してstart()スレッドを開始します (実際にはスレッドを開始しません)。run()

new InterruptionThread().start();
new ReadingThread().start();
于 2012-11-21T08:26:18.790 に答える
0

あなたの問題は生産者/消費者問題タイプだと思います。したがって、BlockingQueueを使用することをお勧めします。

http://docs.oracle.com/javase/1.5.0/docs/api/java/util/concurrent/BlockingQueue.html

また、スレッドを直接処理する代わりに、ExecutorFrameworkを使用すれば簡単です。このようにして、スレッド管理は非常に簡単になります。

于 2012-11-21T08:49:55.043 に答える