0

私はFirstとSecondの2つのクラスを持っています。クラス First では、2 つのスレッドを実行するだけです。クラス Second には、静的変数配列を変更するメソッドと、変更後に配列を読み取るメソッドの 2 つのメソッドがあります。私はこれを待って通知したい。

class First{
  public static void main(String[] args){
    Second s1 = new Second(1);
    Second s2 = new Second(2);
    s1.start();
    s2.start();
  }
}

    class Second extends Thread{
      private static int[] array = {1, 2, 3};
      private int number;

      Second(int number){
        this.number = number;
      }

      public void run(){
        change();
        System.out.println("Out of change: " + getName());
        read();
      }

      public synchronized void change(){
        if(array[0] != 1)
          return;

        System.out.println("Change: " + getName());
        for(int i = 0; i < 10; i++)
          array[0] += i; 
        notify();
      }

      public synchronized void read(){
          try{
          System.out.println("Waiting for change:" + getName());
          wait();
          }
          catch(InterruptedException ie){
            ie.printStackTrace();
          }
        System.out.println("Score: " + array[0]);
      }

}

IllegalMonitorException が発生しています。1 つのスレッドで array[0] を 46 に変更してから、両方のスレッドで array[0] を読み取ります。その問題を解決する方法は?ロック変数を使用する必要がありますか?

4

1 に答える 1

2

を使用するwaitには、同期メソッドから呼び出す必要があります。非同期メソッドから呼び出しています。同期read化すると問題が解決します。

ところで、スレッドではなく配列をロックすることをお勧めします。これは、データに対する制御が必要な場所だからです。メソッドを非同期にしてから、すべてのコードをこの中に入れることでそれを行うことができます:

synchronized(array) {
    // put all the code here
}

次に、呼び出しをwaitと とにnotify変更します。array.waitarray.notify

于 2013-08-24T23:58:21.130 に答える