基于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个
测试效果:
________________________________
请输入仓库的大小
1
请输入要生产的总量
5
生产了第0个
消费了第0个
生产了第1个
消费了第1个
生产了第2个
消费了第2个
生产了第3个
消费了第3个
生产了第4个
消费了第4个
__________________________________
请输入仓库的大小
2
请输入要生产的总量
5
生产了第0个
生产了第1个
消费了第0个
生产了第2个
消费了第1个
生产了第3个
消费了第2个
生产了第4个
消费了第3个
消费了第4个
相关文章推荐
- JAVA-多线程机制中关于生产者消费者模型
- 【Java笔记】——多线程同步机制模拟生产者/消费者模型
- Java多线程-并发协作(生产者消费者模型)
- Java多线程15:Queue、BlockingQueue以及利用BlockingQueue实现生产者/消费者模型
- Java多线程-并发协作(生产者消费者模型)
- Java实践之路——多线程之生产者消费者模型
- Java多线程 -- 生产者消费者模型
- Java多线程15:Queue、BlockingQueue以及利用BlockingQueue实现生产者/消费者模型
- Java多线程-并发协作(生产者消费者模型)
- 进程同步-生产者和消费者(PV操作实现——java多线程模拟)
- Java多线程——生产者消费者模型-演义
- Java多线程-并发协作(生产者消费者模型)
- java多线程--生产者和消费者模型
- java 多线程之 wait(),notify(),notifyAll()以及经典的生产者消费者模型
- java多线程交互 经典实例__生产者与消费者模型
- 多线程模拟实现生产者/消费者模型
- 多线程模拟实现生产者/消费者模型
- Java多线程---并发协作(生产者消费者模型)
- 从java多线程实现“生产者-消费者”模型来谈谈操作系统中线程状态的转换及线程同步的总结
- java多线程中的生产者与消费者之等待唤醒机制@Version1.0