java - 为什么会出现 IllegalMonitorStateException?

标签 java multithreading

我正在尝试使用三个线程交替打印。 第一个线程应该打印一个数字,然后第二个线程打印第二个数字,然后第三个线程。我尝试使用共享静态整数来实现它,但我的代码显示 IllegalMonitorStateException。任何人都可以检查一下并告诉我的错误吗?

class ThreadRevisit extends Thread
{
static Integer number;
int num;
ThreadRevisit(String name,Integer number,int num)
{
  super(name);
  this.number=number;
  this.num=num;
}

 public void run()
{
  int n= number;
  do
  {
  synchronized(ThreadRevisit.number)
       {
           if(n>100)
           {
           number.notifyAll();
           break;
           }
           if (n%3==num)
           {
              System.out.println(Thread.currentThread().getName()+" "+num);
              number=number+1;
           }
            number.notifyAll();
            try
            {
             number.wait();
            }catch(Exception e)
            {

            }
       }
     }
   while(true);

    } 
}
class T1
{
public static void main(String[] ar) 
 {
 Integer inn=new Integer(0);
 ThreadRevisit.number=inn;
 ThreadRevisit t1=new ThreadRevisit("one",inn,0);
 ThreadRevisit t2=new ThreadRevisit("two",inn,1);
 ThreadRevisit t3=new ThreadRevisit("three",inn,2);

 t1.start();
 t2.start();
 t3.start();
 }

最佳答案

第 27 行

number=number+1;

您可以有效地将对象编号更改为具有更高值的新对象编号。所以新的没有连接显示器,这会导致错误。

关于java - 为什么会出现 IllegalMonitorStateException?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43429015/

相关文章:

java - 如何从 Android 中的单独线程设置文本

java - 为什么Spring MVC会以404响应并报告“在DispatcherServlet中未找到带有URI […]的HTTP请求的映射”?

java - TCP 线程池(地址已在使用中)

java - 如何从另一个 Runnable 类更新 java GUI? java

java - Rx(Java 响应式(Reactive)扩展)具有时间间隔的 Zip 运算符

c# - 当用户调用时关闭线程

java - BufferedWriter 不写入所有信息

java.lang.IllegalArgumentException : Not a managed type With @Entity and @Repository Setup with Spring Boot 2

python - 从线程(concurrent.futures)更改小部件的可见性,在正常模式下不起作用,在 Debug模式下它可以工作,为什么?

java - 为什么线程会自发地从 wait() 中唤醒?