2012-02-14 17 views
1

誰かが私を助けてくれることを願っています。私は、Javaスレッドを使って信号を発信しようとしています。 2つの円があります。各円はランプ(糸)です。私は(再び、再びいくつかの秒間と...)各ランプは、xミリ秒のために働きたいし、他のランプの仕事をオフにして聞かせjavaスレッド単純な愚かなプログラム

public void run() 
{ 
    while (true) 
    {   
     repaint(); 
     if (working) 
     { 
      System.out.println(name + " is WORKING "); 
      try 
      { 
       Thread.sleep(LAMP_WORKING_TIME); 
      } 
      catch (InterruptedException e) 
      { 
       e.printStackTrace(); 
      } 

      System.out.println(name + " has done working"); 

      synchronized (lock) 
      { 
       this.working = false; 
       lock.notifyAll(); 
      } 
     } 
     else 
     { 
      try 
      { 
       System.out.println(name + " is waiting.."); 

       synchronized (lock) 
       { 
        lock.wait(); 
        working = true; 
       } 

       System.out.println(name + " is WAKING UP AFTER WAIT"); 
      } 
      catch (InterruptedException e) 
      { 
       e.printStackTrace(); 
      } 
     } 
    } 
} 

ロックは、クラスのプロパティとして宣言されている場合:

private final Object lock = new Object(); 

私の問題は、wait/notifyメソッドによって発生すると考えられます。 お願いします。

+0

私の宿題ではありません。誰もそれをチェックするつもりはない。それはテストの準備です。 – Noray

+0

さらにコードを追加する必要があります。どこでどのように「働く」と「ロック」を定義しますか? – toto2

+0

また、あなたがwait/notifyを学ぶためにそれをしていたかどうかはわかりませんが、もしそうでなければ、いくらか推奨されていないことを知っていて、代わりにjava.util.concurrentのユーティリティを使うべきです。しかし、あなたのケースでは、スイングタイマーがまさにあなたが望んでいるように見えます。 – toto2

答えて

1

おそらく、lockをインスタンス間で共有したいと思うかもしれません。だからstaticにするか、finalであっても、インスタンスごとに新しいパラメータを作成するのではなく、パラメータとしてRunnables/Threadsに渡してください。

+0

ありがとう。それは働いている! :) – Noray

2

コードが読み取ると、LAMP_WORKING_TIMEミリ秒待機し、falseに設定し、次のループですぐにtrueに戻します。 workingが真のときだけ眠っているので、 "オン"サイクルはLAMP_WORKING_TIMEであり、 "オフ"サイクルはロックを解除して再取得するのと同じくらい長くなります。おそらく1ms未満です。

+0

eclipseデバッガでは、working = trueの行には届かない(ロックブロックの待機後) – Noray

関連する問題