博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
java中多线程模拟(多生产,多消费,Lock实现同步锁,替代synchronized同步代码块)...
阅读量:6272 次
发布时间:2019-06-22

本文共 2391 字,大约阅读时间需要 7 分钟。

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();      }}
本文转自 小眼儿 博客园博客,原文链接:http://www.cnblogs.com/hujunzheng/p/3920876.html,如需转载请自行联系原作者
你可能感兴趣的文章
python操作redis--string
查看>>
echarts图表初始大小问题及echarts随窗口变化自适应
查看>>
Inherits、CodeFile、CodeBehind的区别
查看>>
创建一个SimpleDlg
查看>>
使用XML生成菜单
查看>>
udp,tcp对于socket的写法
查看>>
第二周个人赛
查看>>
推断Windows版本号新方法
查看>>
2017-4-18 ADO.NET
查看>>
RSuite 一个基于 React.js 的 Web 组件库
查看>>
技术博客网址收藏
查看>>
python 金融分析学习
查看>>
授人以渔不如授人以鱼
查看>>
matlab练习程序(图像Haar小波变换)
查看>>
【Java】从域名得到ip
查看>>
Mysql索引会失效的几种情况分析
查看>>
LVM逻辑卷
查看>>
zoj3591 Nim(Nim博弈)
查看>>
canvas绘图
查看>>
poj - 3039 Margaritas on the River Walk
查看>>