<span style="font-family:Times New Roman;">package communication;</span>
<span style="font-family:Times New Roman;">
//运行结果不太能理解,-1 ????
/*开始消费者调用消费方法时处于等待状态,此时唤起生产者线程
* 生产者开始生产共享数据之后,消费者进行消费,但是当共享数据为空,所有消费者必须等待,生产者继续生产,然后消费者再次消费
* 如此循环直到程序运行最后,可以看到线程一直等待。
* 这个线程进入等待后没有其他线程唤醒,出除非强行退出JVM环境,否则一直等待..*/
public class ThreadCommunication{
public static void main(String args[]){
Queue q = new Queue();
Producer p = new Producer(q);
Consumer c = new Consumer(q);
c.start();
p.start();
}
}
//生产者线程
class Producer extends Thread {
Queue q;
Producer(Queue q) {
this.q = q;
}
public void run() {
for (int i = 0; i < 5; i++) {
q.put(i);// 给队列中添加元素
}
}
}
// 消费者线程
class Consumer extends Thread {
Queue q;
Consumer(Queue q) {
this.q = q;
}
public void run() {
while (true) {
q.get();// 删除队列元素,返回队列余值
}
}
}
class Queue {
int value = 0;//初始时,队列中元素个数value为0
boolean isEmpty = true;//用于判断队列的状态,空或非空
//生产者生产方法
public synchronized void put(int v) {
if(!isEmpty){//队列不空时,生产者线程等待
System.out.println("队列非空,生产者等待...");
try {
wait();//等待队列有空闲
} catch (InterruptedException e) {
e.printStackTrace();
}
}
//队列为空时,生产者生产,value+1;isEmpty置为false
System.out.println("\n生产者生产:");
value+=v;//value值加v
isEmpty = false;
System.out.println("生产者共生产数量:"+v);
notify();//生产者生产之后通知消费者消费
}
//消费者消费方法
public synchronized int get() {
if(isEmpty){//队列为空时,消费者线程等待。
System.out.println("队列为空,消费者等待...");
try {
wait();//等待队列有空闲
} catch (InterruptedException e) {
e.printStackTrace();
}
}
//队列不空时,消费:value-1;减到0,将isEmpty置为true通知生产者生产。
System.out.println("\n消费者消费:");
value--;//value值减v
if(value<1){//判断value是否减成了零
isEmpty =true;
}
System.out.println("消费者消费一个,剩余:"+value);
notifyAll();//消费者消费后,通知生产者生产
return value;
}
}
</span>