您的位置:首页 > 其它

《生产者与消费者》简单例子?

2015-01-19 10:58 232 查看
<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>
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: