[英]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.