如何在下面的程序中将一个线程从一个对象通知给另一个对象,而不使用以下生产者和消费者问题中的同步方法。通知另一个对象中的线程
我使用的是queue
类的put
和get
方法和Producer
类和Consumer
类的run()
方法使用wait()
和notify()
。
我的目标是使用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。使用BlockingQueue时,不需要使用等待和通知。队列将等待并通知线程。消费者只需从队列中获取项目,然后队列将其阻塞,直到有可用项目。生产者只是将项目放入队列中,并且被队列阻塞,直到队列中剩余空间(如果有界限的话)。 – 2014-10-27 07:13:23
线程之间共享的对象是队列,所以你必须在那里同步,而不是在生产者/消费者! – isnot2bad 2014-10-27 08:05:43
将使用阻塞队列..感谢@ JB Nizer和isnot2bad。 – 2014-10-27 11:09:33