您的位置:首页 > 编程语言 > Java开发

基于Java多线程机制的生产者-消费者模型模拟

2005-06-09 19:07 573 查看
[align=left]/* [/align][align=left] [/align][align=left]*Author:Junyi Sun [/align][align=left] [/align][align=left]*From:CCNU [/align][align=left] [/align][align=left]*E-mail:fxsjy@yahoo.com.cn [/align][align=left] [/align][align=left]*/ [/align][align=left] [/align][align=left]import java.io.*;[/align][align=left] [/align][align=left]class Semaphore[/align][align=left]{[/align][align=left] private int count;[/align][align=left] private int cnt_max;[/align][align=left] public Semaphore(int cnt,int cntm){[/align][align=left] count=cnt;[/align][align=left] cnt_max=cntm;[/align][align=left] }[/align][align=left] public synchronized void p(){[/align][align=left] while(count<=0){[/align][align=left] try{[/align][align=left] wait();[/align][align=left] }[/align][align=left] catch(InterruptedException e){[/align][align=left] [/align][align=left] }[/align][align=left] }[/align][align=left] count--;[/align][align=left] notify();[/align][align=left] }[/align][align=left] public synchronized void v(){[/align][align=left] while(count>=cnt_max){[/align][align=left] try{[/align][align=left] wait();[/align][align=left] }[/align][align=left] catch(InterruptedException e){[/align][align=left] [/align][align=left] }[/align][align=left] }[/align][align=left] count++;[/align][align=left] notify();[/align][align=left] [/align][align=left] }[/align][align=left]}[/align][align=left] [/align][align=left]class Producer extends Thread[/align][align=left]{[/align][align=left] private Semaphore full,empty,mux;[/align][align=left] private int total;[/align][align=left] Producer(Semaphore _full,Semaphore _empty,Semaphore _mux,int _total){[/align][align=left] full=_full;[/align][align=left] empty=_empty;[/align][align=left] mux=_mux; [/align][align=left] total=_total;[/align][align=left] }[/align][align=left] private void tell(int i){[/align][align=left] System.out.print("生产了第");[/align][align=left] System.out.print(i);[/align][align=left] System.out.print("个/n");[/align][align=left] }[/align][align=left] public void run(){[/align][align=left] int i;[/align][align=left] for(i=0;i<total;){[/align][align=left] empty.p(); [/align][align=left] mux.p();[/align][align=left] tell(i);[/align][align=left] mux.v();[/align][align=left] i++;[/align][align=left] full.v();[/align][align=left] }[/align][align=left] }[/align][align=left]}[/align][align=left] [/align][align=left]class Consumer extends Thread[/align][align=left]{[/align][align=left] private Semaphore full,empty,mux;[/align][align=left] private int total;[/align][align=left] Consumer(Semaphore _full,Semaphore _empty,Semaphore _mux,int _total){[/align][align=left] full=_full;[/align][align=left] empty=_empty;[/align][align=left] mux=_mux;[/align][align=left] total=_total;[/align][align=left] }[/align][align=left] private void tell(int i){[/align][align=left] System.out.print("消费了第");[/align][align=left] System.out.print(i);[/align][align=left] System.out.print("个/n");[/align][align=left] }[/align][align=left] public void run() {[/align][align=left] int i;[/align][align=left] for(i=0;i<total;){[/align][align=left] full.p();[/align][align=left] mux.p();[/align][align=left] tell(i);[/align][align=left] mux.v();[/align][align=left] i++;[/align][align=left] empty.v();[/align][align=left] }[/align][align=left] }[/align][align=left]}[/align][align=left] [/align][align=left]class IPC[/align][align=left]{[/align][align=left] public static void main(String args[]){[/align][align=left] Semaphore full,empty,mux;[/align][align=left] int size=0,total=0;[/align][align=left] System.out.println("请输入仓库的大小");[/align][align=left] try{[/align][align=left] size=Integer.parseInt((new BufferedReader(new InputStreamReader(System.in))).readLine());[/align][align=left] }catch(IOException e){[/align][align=left] };[/align][align=left] System.out.println("请输入要生产的总量");[/align][align=left] [/align][align=left] try{[/align][align=left] [/align][align=left] total=Integer.parseInt((new BufferedReader(new InputStreamReader(System.in))).readLine());[/align][align=left] [/align][align=left] }catch(IOException e){[/align][align=left] };[/align][align=left] [/align][align=left] full=new Semaphore(0,size);[/align][align=left] empty=new Semaphore(size,size);[/align][align=left] mux=new Semaphore(1,1);[/align][align=left] Producer producer=new Producer(full,empty,mux,total);[/align][align=left] Consumer consumer=new Consumer(full,empty,mux,total);[/align][align=left] producer.start();[/align][align=left] while(!producer.isAlive());[/align][align=left] consumer.start();[/align][align=left] try{[/align][align=left] System.in.read();[/align][align=left] }[/align][align=left] catch(IOException e){};[/align][align=left] }[/align][align=left]}[/align][align=left] [/align]

测试效果:

________________________________
请输入仓库的大小
1
请输入要生产的总量
5
生产了第0个
消费了第0个
生产了第1个
消费了第1个
生产了第2个
消费了第2个
生产了第3个
消费了第3个
生产了第4个
消费了第4个

__________________________________

请输入仓库的大小
2
请输入要生产的总量
5
生产了第0个
生产了第1个
消费了第0个
生产了第2个
消费了第1个
生产了第3个
消费了第2个
生产了第4个
消费了第3个
消费了第4个
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: