Я пробую производителя потока 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);
}
}
}
wait()
в классеConsumer
, вы должны выполнить свою бизнес-логику для обработки материала в строковом буфере. Вы должны перейтиwait()
только в том случае, если нет данных, доступных для обработки. - person Alex Suo   schedule 25.11.2016notify()
пробуждает только "подходящие потоки", которые в настоящее время не активны, но ожидают уведомления, чтобы они могли получить блокировку. Надеюсь, это будет полезно. - person nits.kk   schedule 04.02.2017