【发布时间】:2016-11-25 07:32:25
【问题描述】:
我正在尝试 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();
}
}
这是生产者类,将数据附加到字符串缓冲区并通知消费者类
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()。 -
这个问题可能有用:stackoverflow.com/questions/37683895/…。它使用 BlokcingQueues 删除等待和通知。用字符串替换整数
-
@user3509105 请参考下面我的回答。希望对您有所帮助。方法
notify()仅唤醒当前未唤醒但正在等待通知的“合格线程”,以便他们可以获取锁。希望对您有所帮助。
标签: java multithreading synchronization thread-sleep java-threads