Как уведомлять поток из одного объекта в другой в нижеприведенной программе без использования синхронизированных методов в следующих проблемах производителя и потребителя.уведомлять потоки в другом объекте
Я использую queue
класс для put
и 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)
Использовать BlockingQueue. Вам не нужно использовать wait и уведомлять при использовании BlockingQueue. Очередь будет ждать и уведомлять темы. Потребитель просто получает предметы из очереди, и очередь блокирует его, пока не появится доступный элемент. Продюсер просто помещает элементы в очередь и блокируется очередью, пока в очереди не осталось места (если оно ограничено). –
Объект, разделяемый между потоками, это Queue, поэтому вам нужно синхронизировать его, а не в Producer/Consumer! – isnot2bad
будет использовать Блокирующую очередь. Это @ JB Nizer и isnot2bad. –