wait()和notify()方法

时间:2013-08-24 23:55:27

标签: java multithreading wait notify

我有两个班级第一和第二。在第一课中,我只运行两个主题。 Class Second有两个方法,一个用于更改静态变量数组,另一个用于在更改后读取数组。我想这样做,等待并通知。

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。我想将一个线程更改数组[0]更改为46,然后在两个线程中读取数组[0]。如何解决这个问题?我必须使用锁定变量吗?

1 个答案:

答案 0 :(得分:2)

要使用wait,您必须从同步方法中调用它。您是从非同步方法调用它。使read同步将解决问题。

顺便说一句,锁定数组而不是线程是一个更好的主意,因为这是需要对数据进行控制的地方。您可以通过使方法不同步,然后将所有代码放在其中来实现:

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

然后将对waitnotify的来电更改为array.waitarray.notify