Java Notify方法在多线程处理中的应用
我正在学习多线程 我尝试用Java实现生产者-消费者问题,效果很好。 但是如果我删除notify调用,程序就会进入死锁状态。为什么 当队列的大小变为0时,它将进入死锁状态。理想情况下,当队列的大小变为0时,应该在使用者内部调用wait,生产者应该开始工作Java Notify方法在多线程处理中的应用,java,multithreading,synchronization,wait,Java,Multithreading,Synchronization,Wait,我正在学习多线程 我尝试用Java实现生产者-消费者问题,效果很好。 但是如果我删除notify调用,程序就会进入死锁状态。为什么 当队列的大小变为0时,它将进入死锁状态。理想情况下,当队列的大小变为0时,应该在使用者内部调用wait,生产者应该开始工作 import java.io.*; import java.util.*; class Consumer implements Runnable{ Queue<Integer> q; int n; public void ru
import java.io.*;
import java.util.*;
class Consumer implements Runnable{
Queue<Integer> q;
int n;
public void run() {
while(true){
synchronized (q) {
while(q.size()==0){
try {
System.out.println("q.size="+q.size());
q.wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
System.out.println("item consumed="+q.poll());
q.notify();
try {
Thread.sleep((int)(Math.random() * 100));
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
}
Consumer(Queue<Integer> queue,int n){
q=queue;
this.n=n;
}
}
class Producer implements Runnable{
Queue<Integer> q;
int n;
public void run() {
int x=1;
while(true){
synchronized (q) {
while(q.size()==n){
try {
q.wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
System.out.println("item produced="+x+" q.size="+q.size());
q.add(x++);
q.notify();
try {
Thread.sleep((int)(Math.random() * 100));
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
}
Producer(Queue<Integer> queue,int n){
q=queue;
this.n=n;
}
}
public class App
{
public static void main( String[] args ) throws InterruptedException
{
int n=100;
Queue<Integer> q=new LinkedList<Integer>();
Thread t1=new Thread(new Producer(q, n));
Thread t2=new Thread(new Consumer(q, n));
t1.start();
t2.start();
t1.join();
t2.join();
}
}
您需要notify,因为当一个线程处于等待状态(因为队列为空或已满)时,如果其他线程在PUT之后通知队列是否为空,而获取队列是否已满,则会进入运行状态。 把问题放在第10位;所以,您的代码不会进入死锁状态,因为经过一段时间后,它将检查while循环条件。
在上述用例中使用notify始终是最佳做法您能否共享System.out.printlns当前显示的内容?为了便于管理的示例,请将n减少到较小的数字。另外,可能值得一看BlockingQueue,因为这可能会提供您正在寻找消费者线程块的行为,直到队列包含内容为止。