首页 > 代码库 > java中多线程模拟(多生产,多消费,Lock实现同步锁,替代synchronized同步代码块)
java中多线程模拟(多生产,多消费,Lock实现同步锁,替代synchronized同步代码块)
import java.util.concurrent.locks.*;class DuckMsg{ int size;//烤鸭的大小 String id;//烤鸭的厂家和标号 DuckMsg(){ } DuckMsg(int size, String id){ this.size=size; this.id=id; } public String toString(){ return id + " 大小为:" + size; }}class Duck{ private int count=0;//生产烤鸭的总数 private int putId=0, takeId=0;//分别表示存入的Id 和 取出烤鸭的Id Lock lock = new ReentrantLock(); DuckMsg[] dk = new DuckMsg[100];//烤鸭的容器 Condition conProduce = lock.newCondition(); Condition conConsume = lock.newCondition(); public void put(int sz){ lock.lock(); try{ while(count==dk.length)//一直等到烤鸭全部生产完毕之后所有的生产线程都停止.... conProduce.await(); dk[putId++]=new DuckMsg(sz, Thread.currentThread().getName()+":"+(putId-1)); if(putId==dk.length) putId=0;//啥意思呢?烤鸭的编号就是1到100, 如果过了100,那么再从编号1开始! ++count; conConsume.signal(); }catch(InterruptedException e){ }finally{ lock.unlock(); } } public void get(){ lock.lock(); try{ while(count==0) conConsume.await(); System.out.println(dk[takeId++]); System.out.println("......." + Thread.currentThread().getName());//打印消费的厂家 if(takeId==dk.length) takeId=0; --count; conProduce.signal(); }catch(InterruptedException e){ }finally{ lock.unlock(); } }}class Producer implements Runnable{ Duck duck; Producer(Duck duck){ this.duck=duck; } public void run(){ for(int i=1; ; ++i) duck.put(i); }}class Consumer implements Runnable{ Duck duck; Consumer(Duck duck){ this.duck=duck; } public void run(){ while(true) duck.get(); }}public class ProduceConsumeDemo{ public static void main(String[] args){ Duck duck=new Duck(); Thread t1 = new Thread(new Producer(duck), "生产厂家 1"); Thread t2 = new Thread(new Producer(duck), "生产厂家 2"); Thread t3 = new Thread(new Consumer(duck), "消费厂家 1"); Thread t4 = new Thread(new Consumer(duck), "消费厂家 2"); t1.start(); t2.start(); t3.start(); t4.start(); }}
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。