zoukankan      html  css  js  c++  java
  • 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();
          }
    }
  • 相关阅读:
    变形金刚还有一个星期!
    SQLSERVER中日期显示样式(网络收集)
    美国《商业周刊》网站提前公布的2007年度世界最有价值品牌
    昨天论文被录 开心
    怎样用javascript操作ftb编辑区内容
    c#中 @的用处
    图片滚动代码。
    一段实现分页的存储过程
    下拉列表控制文本框的个数思路
    什么是ERP (转载自百度知道)
  • 原文地址:https://www.cnblogs.com/hujunzheng/p/3920876.html
Copyright © 2011-2022 走看看