gpt4 book ai didi

java - 带条件的 IllegalMonitorStateException

转载 作者:行者123 更新时间:2023-12-01 18:52:30 24 4
gpt4 key购买 nike

所以我正在尝试编写一个程序来打印出以下输出:

44
33
22
11

该程序应该是多线程的,并且必须使用锁来防止竞争条件。它还必须利用 Condition,以便当线程想要打印的数字与变量 threadnum(必须打印的下一个数字)不对应时,它必须等待。我已经得到了大部分的信息,除了当我尝试运行它时遇到 IllegalMonitorStateExceptions 并且我不确定是什么原因导致它,也不知道如何修复它。我希望得到一些帮助。提前致谢。

public class Threadlocksrev implements Runnable {
Lock lock = new ReentrantLock();
Condition wrongNumber = lock.newCondition();
int i;
static int threadnum = 4;

public Threadlocksrev(int i){
this.i = i;
}

private int getI(){
return i;
}

@Override
public synchronized void run() {
lock.lock();
while(true){
if (threadnum == i){
try{
System.out.print(getI());
System.out.print(getI());
System.out.print("\n");
threadnum--;
wrongNumber.signalAll();
}
catch(Exception e){
e.printStackTrace();
}
finally{

lock.unlock();
}
}
else{
try {
wrongNumber.await();
}
catch (InterruptedException e) {
e.printStackTrace();
}
finally{
wrongNumber.signalAll();
lock.unlock();
}
}


}
}
}

主类:

public class ThreadlocksrevInit {

private static final int max_threads = 4;

public static void main(String[] args) {
Threadlocksrev task1 = new Threadlocksrev(1);
Threadlocksrev task2 = new Threadlocksrev(2);
Threadlocksrev task3 = new Threadlocksrev(3);
Threadlocksrev task4 = new Threadlocksrev(4);
Thread thread1 = new Thread(task1);
Thread thread2 = new Thread(task2);
Thread thread3 = new Thread(task3);
Thread thread4 = new Thread(task4);

thread1.start();
thread2.start();
thread3.start();
thread4.start();
}

}

最佳答案

您正忙于在同一个线程中旋转,一遍又一遍地尝试解锁,当调用线程不拥有锁时,会导致非法监视器状态异常。在此代码中:

if (threadnum == i){

您正在将静态变量与线程的索引进行比较。因为静态变量将具有相同的值(在设置所有线程之后),所以您仅为同一个线程调用 while 循环。其他人都被封锁了。因为你这样做了:

lock.lock();

在 while 循环之外,唯一正在运行的线程仅在第一次(即获得锁时)正确执行。在循环的所有其他迭代中,它没有有效的锁,因此当它调用时:

finally{
lock.unlock();
}

您收到非法监视器状态异常。

关于java - 带条件的 IllegalMonitorStateException,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15335589/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com