有两个线程的IllegalMonitorStateException

Wei*_*ing 0 java multithreading

我的程序有两个线程,每个线程打印十个数字。第一个线程打印奇数,第二个线程打印偶数,然后轮流打印数字。我期望得到一个像1,2,3,4,5 ....直到20的序列,但是该程序会产生一个IllegalMonitorStateException。

我知道此异常的含义,但是我在和同步块中使用wait()notify()。这是我的代码:

     public class EvenOddThreadTest {

      /**
       * @param args
       */
      static Object obj1 = new Object();
      static Object obj2 = new Object();
      static Object obj3=new EvenOddThreadTest();

      public static void main(String[] args) throws InterruptedException {
          new Thread() {
              @Override
              public void run() {

                      for (int i = 1; i < 21; i += 2) {
                          synchronized (obj1) {
                          System.out.println(i + Thread.currentThread().getName());
                          try {
                              obj2.notify();                    
                              obj1.wait();
                          } catch (InterruptedException e) {
                              e.printStackTrace();
                          }

                      }
                  }
              }
          }.start();
          new Thread() {
              @Override
              public void run() {
                      for (int i = 2; i < 21; i += 2) {
                          synchronized (obj2) {

                          System.out.println(i + Thread.currentThread().getName());
                        try {
                            obj1.notify();
                            obj2.wait();
                        } catch (InterruptedException e) {
                            e.printStackTrace();
                        }
                    }
                }
            }

            }.start();
        }
    }
Run Code Online (Sandbox Code Playgroud)

这是生成的异常:

1Thread-0
2Thread-1
Exception in thread "Thread-0" java.lang.IllegalMonitorStateException
    at java.lang.Object.notify(Native Method)
    at EvenOddThreadTest$1.run(EvenOddThreadTest.java:21)
Exception in thread "Thread-1" java.lang.IllegalMonitorStateException
    at java.lang.Object.notify(Native Method)
    at EvenOddThreadTest$2.run(EvenOddThreadTest.java:41)
Run Code Online (Sandbox Code Playgroud)

我不知道这个。有任何想法吗?

art*_*tol 5

您不能在您不拥有其监视器的对象上调用通知:

               synchronized (obj1) {
                  System.out.println(i + Thread.currentThread().getName());
                  try {
                      obj2.notify();  // You haven't synchronized on obj2 
Run Code Online (Sandbox Code Playgroud)