0

我有两个班第一和第二。在第一堂课中,我只运行两个线程。第二类有两种方法,一种是改变静态变量数组,一种是改变后读取数组。我想做这个等待并通知。

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

4

1 回答 1

2

为了使用wait,您必须从同步方法中调用它。您正在从非同步方法调用它。使read同步将解决问题。

顺便说一句,锁定数组而不是线程会更好,因为这是需要控制数据的地方。您可以通过使您的方法不同步来做到这一点,然后将所有代码放入其中:

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

然后将呼叫更改为waitandnotifyarray.waitand array.notify

于 2013-08-24T23:58:21.130 回答