當(dāng)前位置:
首頁 >
线程同步之经典生产者-消费者模型
發(fā)布時間:2025/5/22
43
豆豆
生活随笔
收集整理的這篇文章主要介紹了
线程同步之经典生产者-消费者模型
小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.
/*
線程同步之生產(chǎn)者-消費(fèi)者模型
該模型符合以下要求:
1、生產(chǎn)者只在倉儲未滿時生產(chǎn),倉滿則停止生產(chǎn);
2、消費(fèi)者只在倉儲未空時消費(fèi),倉空則等待;
3、當(dāng)消費(fèi)者發(fā)現(xiàn)倉儲為空時則通知生產(chǎn)者生產(chǎn);
4、生產(chǎn)者在生產(chǎn)出可消費(fèi)產(chǎn)品時則通知消費(fèi)者來消費(fèi);
*/ 1 package one;
2 class Go{
3 public static final int MAX_NUM=100;//最大庫存量
4 private int currennum;//當(dāng)前庫存
5 Go(){}
6 Go(int currennum){
7 this.currennum=currennum;
8 }
9 public synchronized void produce(int neednum){
10 System.out.println("要生產(chǎn)的產(chǎn)品數(shù)量"+neednum+"與現(xiàn)有倉儲靚之和大于最大倉儲量"+MAX_NUM+",所以不能生產(chǎn)!!");
11 while(currennum+neednum>MAX_NUM){
12 try {
13 this.wait();//使當(dāng)前線程阻塞,并釋放鎖
14 } catch (InterruptedException e) {
15 // TODO Auto-generated catch block
16 e.printStackTrace();
17 }
18 }
19 currennum+=neednum;
20 System.out.println("已經(jīng)生產(chǎn)了"+neednum+",現(xiàn)在倉儲量為:"+currennum);
21 this.notifyAll();//不釋放鎖,也不獲得鎖,僅通知其他線程可以競爭執(zhí)行
22 }
23 public synchronized void consum(int neednum){
24 while(currennum<neednum){
25 System.out.println("現(xiàn)有倉儲量不足,無法消費(fèi)!!");
26 try {
27 this.wait();
28 } catch (InterruptedException e) {
29 // TODO Auto-generated catch block
30 e.printStackTrace();
31 }
32 }
33 currennum-=neednum;
34 System.out.println("已經(jīng)消費(fèi)了"+neednum+",現(xiàn)在倉儲量為:"+currennum);
35 this.notifyAll();
36 }
37 }
38 class Producer extends Thread{
39 private int neednum;
40 private Go go;
41 Producer(int neednum,Go go){
42 this.neednum=neednum;
43 this.go=go;
44 }
45 public void run(){
46 go.produce(neednum);
47 }
48 }
49 class Consumer extends Thread{
50 private int neednum;
51 private Go go;
52 Consumer(int neednum,Go go){
53 this.neednum=neednum;
54 this.go=go;
55 }
56 public void run(){
57 go.consum(neednum);
58 }
59 }
60 public class Practice extends Thread{
61 public static void main(String[] args){
62 Go go=new Go(30);
63 new Consumer(50,go).start();
64 new Consumer(20,go).start();
65 new Consumer(30,go).start();
66 new Producer(10,go).start();
67 new Producer(10,go).start();
68 new Producer(10,go).start();
69 new Producer(10,go).start();
70 new Producer(10,go).start();
71 new Producer(80,go).start();
72 }
73 }
摘自:http://blog.csdn.net/kutekute/article/details/8071421
轉(zhuǎn)載于:https://www.cnblogs.com/XL-Liang/archive/2013/04/09/3009451.html
總結(jié)
以上是生活随笔為你收集整理的线程同步之经典生产者-消费者模型的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: CenterWindow()的用法
- 下一篇: 【2006-4】【木偶玩具】