一:多线程的通信wait 和 notify ;先看下面代码;多个消费者和生产者对同个队列进行生产和消费消息;
声明一个队列类来存放数据,只存放一个数据
public class MyStack {
private List list =new ArrayList();
synchronized public void push(){
try{
if(list.size() ==1){
this.wait();
}
list.add("anyString = "+ Math.random());
this.notify();
System.out.println("push = "+list.size());
}catch(InterruptedException e){
}
}
synchronized public String pop(){
String returnValue = "";
try{
if(list.size() ==0){
System.out.println("pop 操作的:"
+Thread.currentThread().getName()+"线程呈 wait 状态");
this.wait();
}
returnValue = "" +list.get(0);
list.remove(0);
this.notify();
System.out.println("pop =" +list.size());
}catch(InterruptedException e){
e.printStackTrace();
}
return returnValue;
}
}
消费者类:
public class C {
private MyStack myStack;
public C(MyStack myStack){
this.myStack =myStack;
}
public void popService(){
System.out.println("pop = "+myStack.pop());
}
}
生产者类:
public class P {
private MyStack myStack;
public P(MyStack myStack){
this.myStack =myStack;
}
public void pushService(){
myStack.push();
}
}
生产者线程:
public class P {
private MyStack myStack;
public P(MyStack myStack){
this.myStack =myStack;
}
public void pushService(){
myStack.push();
}
}
消费者线程:
public class P_Thread extends Thread{
private P p;
P_Thread(P p){
this.p = p;
}
public void run(){
while(true){
p.pushService();
}
}
}
测试类:
public class P_Thread extends Thread{
private P p;
P_Thread(P p){
this.p = p;
}
public void run(){
while(true){
p.pushService();
}
}
}
运行结果如下:
对于上面的问题;书上给予的解释是:
永远在while循环里而不是if语句下使用wait。这样,循环会在线程睡眠前后都检查wait的条件,并在条件实际上并未改变的情况下处理唤醒通知。
当更改后判定条件后;执行结果是:线程和main方法不运行,出现假死现象:
书上给予的解释是:多线程消费或者多线程生产时候,当调到notify()方法的时候,可能只叫醒同类的线性,说明白一点就是;生产者叫醒了另外一个生产者然后进入到wait中;解决办法把notify()方法改成 notifyAll()