[英]Why is my code throwing an IllegalMonitorStateException?
我试图了解线程如何在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();
}
}
}
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();
}
}
}
有人可以帮助您理解潜在的问题是什么吗?
您有三个线程,即main
线程t1
和t2
。 拥有锁的线程可以使用动作notify
, notifyAll
和wait
。 在这种情况下, main
线程拥有的锁不是t1
或t2
。
您将需要在每个线程的run
方法内进行同步才能wait
。
这是我在run
方法中进行synchronizing
意思的示例。
启动线程后, 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
方法中进行同步,以便t1
和t2
在通知或等待时拥有锁。
这可能不会帮助您了解底层的线程机制,但是对于您而言,将CyclicBarrier
与CyclicBarrier
一起使用是有意义的。
在处理n = n + 2
,使两个踏步都在障碍上等待,让barrierAction sysout重复两个线程的当前n
。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.