为什么我的代码抛出了IllegalMonitorStateException?

use*_*730 1 java multithreading

我试图理解线程如何在Java中工作.因此,我写了一小段代码,通过我创建两个线程,一个打印所有奇数和其他打印偶数,并尝试在它们之间进行同步,以便按顺序打印所有数字.

public class Main 
{

    public static void main (String args[]){

        Main lock = new Main();

        Test t1 = new Test(1, lock);

        Test t2 = new Test(2, lock);

        synchronized(lock){

            (new Thread(t1)).start();
            (new Thread(t2)).start();

        }


    }

}
Run Code Online (Sandbox Code Playgroud)
public class Test implements Runnable {


    int n;
    Main lock;

    public Test(int newN, Main lockObj){
        this.n = newN;
        this.lock = lockObj;
    }


    public void run() {


        while(true){

            if (n != 1){
                try {
                    lock.wait();
                } catch (InterruptedException e) {

                    e.printStackTrace();
                }
            }

            n = n + 2;

            System.out.println(n);

            lock.notify();

        }


    }


}
Run Code Online (Sandbox Code Playgroud)

有人可以帮助了解潜在的问题是什么吗?

Joh*_*int 6

你有三个线程,main线程t1t2.拥有锁的线程可以使用操作notify,notifyAllwait.在这种情况下,main线程不拥有锁t1t2.

您需要在run每个线程的方法内进行同步才能够wait.


这是我synchronizingrun方法中的意思的一个例子.

run启动线程后从该方法发生的任何操作都将由该线程运行完成.因此,当您尝试并且wait您希望确保线程拥有锁时,您可以通过在run方法中同步它来完成此操作.

public void run() {
     synchronized(lock){
         while(true){
            if (n != 1){
                try {
                    lock.wait();
                } catch (InterruptedException e) {
                    e.printStackTrace();
               }
            }
            n = n + 2;
            System.out.println(n);
            lock.notify();
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

正如你可以看到我的内同步run,这样的方法t1t2自己的锁,同时通知或等待.