gpt4 book ai didi

java - 通知不同对象中的线程

转载 作者:行者123 更新时间:2023-12-01 17:03:17 26 4
gpt4 key购买 nike

在下面的生产者和消费者问题中,如何在不使用同步方法的情况下,在下面的程序中将线程从一个对象通知到另一个对象。

我正在使用queue put 的类(class)和get方法和使用wait()notify()run()方法Producer类和Consumer类。

我的目标是使用wait()notify() Producer中的方法类和Consumer类,而不是在 Queue 中使用它们类。

它给出了 IllegalMonitorStateException .

程序:

package threads;

class Queue{
int num;

int get(int number)
{

System.out.println("The Consumer "+number+" got "+num);
return num;
}

void put(int n,int number)
{

this.num=n;
System.out.println("The producer "+number+" put "+this.num);

}
}

public class producerandconsumer{
boolean flag=false;
class Producer implements Runnable{
Queue q;
int number;
Producer(Queue q,int number)
{
this.q=q;
this.number = number;
new Thread(this,"Producer").start();
}

public void run()
{
for(int i=0;i<10;i++)
{
while(flag)
try{
wait();
}
catch(InterruptedException e){
System.out.println("InterruptedException caught ");
}
q.put(i,number);
flag=true;
notify();
}
}

}

class Consumer implements Runnable{
Queue q;
int number;
Consumer(Queue q,int number)
{
this.q=q;
this.number=number;
new Thread(this,"Consumer").start();
}

public void run()
{
for(int i=0;i<10;i++)
{
while(!flag)
try{
wait();
}
catch(InterruptedException e){
System.out.println("InterruptedException caught ");
}
flag=false;
notify();
q.get(number);
}
}
}



public static void main(String[] args) {
// TODO Auto-generated method stub
producerandconsumer pc= new producerandconsumer();
Queue q=new Queue();
pc.new Producer(q,1);
pc.new Consumer(q,1);


}

}

程序的输出:给出 IllegalMonitorStateException .

 The producer 1 put 0 Exception in thread "Producer" 
java.lang.IllegalMonitorStateException
at java.lang.Object.notifyAll(Native Method)
at threads.producerandconsumer$Producer.run(producerandconsumer.java:48)
at java.lang.Thread.run(Unknown Source)

Exception in thread "Consumer" java.lang.IllegalMonitorStateException
at java.lang.Object.notifyAll(Native Method)
at threads.producerandconsumer$Consumer.run(producerandconsumer.java:76)
at java.lang.Thread.run(Unknown Source)

最佳答案

方法waitnotify必须在synchronized block 内调用。这就是为什么你会得到 illegelMonitorStateException。

关于java - 通知不同对象中的线程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26582517/

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