我正在尝试Java线程生产者和消费者程序。 但消费者线程始终处于等待状态。Java线程生产者和消费者程序问题
我无法调试的问题,为什么消费者线程总是转到待机状态或生产者未通知消费者线程
请帮我解决这个问题。程序如下。
通信器类调用这两个生产国和消费类
public class Communicator {
Thread t = null;
Thread t1 = null;
public void runThread() {
Producer p = new Producer();
Consumer c = new Consumer(p);
t = new Thread(p);
t1 = new Thread(c);
t.start();
t1.start();
Thread tr = new Thread() {
public void run() {
for (int i = 0; i < 30; i++) {
System.out.println("t::::::::::::: " + t.getState());
System.out.println("t1::::::::::::: " + t1.getState());
try {
Thread.sleep(2000);
} catch (InterruptedException ie) {
ie.printStackTrace();
}
}
}
};
tr.start();
}
public static void main(String[] args) {
Communicator c = new Communicator();
c.runThread();
}
}
这是生产类数据中追加的StringBuffer,并通知消费者类
public class Producer extends Thread {
public StringBuffer sb;
public Producer() {
sb = new StringBuffer();
}
public void run() {
synchronized (sb) {
try {
System.out.println("Bala");
sb.append("murugan");
sb.notify();
} catch (Exception e) {
e.printStackTrace();
}
}
}
}
下面是消费类代码。它等待从生产者类获得通知。
public class Consumer extends Thread {
public Producer p;
public Consumer(Producer p) {
this.p = p;
}
public void run(){
synchronized (p.sb) {
try {
p.sb.wait();
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
System.out.println(p.sb);
}
}
}
在'Consumer'类中的'wait()'之前,你应该做你的业务逻辑来处理字符串缓冲区中的东西。只有在没有可用的数据可供处理时,才应该使用wait()。 –
此问题可能会有用:http://stackoverflow.com/questions/37683895/wait-and-notify-in-consumer-and-producer-threads/37686902#37686902。它删除等待并通过BlokcingQueues通知。用字符串替换Interger –
@ user3509105请参考下面的答案。希望这会有所帮助。方法'notify()'只唤醒那些当前没有醒来但正在等待通知的符合条件的线程,以便他们能够获得锁。希望它会有所帮助。 –