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();
      }
}
复制代码









本文转自 小眼儿 博客园博客,原文链接:http://www.cnblogs.com/hujunzheng/p/3920876.html,如需转载请自行联系原作者
目录
相关文章
|
9月前
|
JSON 网络协议 安全
【Java】(10)进程与线程的关系、Tread类;讲解基本线程安全、网络编程内容;JSON序列化与反序列化
几乎所有的操作系统都支持进程的概念,进程是处于运行过程中的程序,并且具有一定的独立功能,进程是系统进行资源分配和调度的一个独立单位一般而言,进程包含如下三个特征。独立性动态性并发性。
431 1
|
9月前
|
JSON 网络协议 安全
【Java基础】(1)进程与线程的关系、Tread类;讲解基本线程安全、网络编程内容;JSON序列化与反序列化
几乎所有的操作系统都支持进程的概念,进程是处于运行过程中的程序,并且具有一定的独立功能,进程是系统进行资源分配和调度的一个独立单位一般而言,进程包含如下三个特征。独立性动态性并发性。
397 1
|
10月前
|
数据采集 存储 弹性计算
高并发Java爬虫的瓶颈分析与动态线程优化方案
高并发Java爬虫的瓶颈分析与动态线程优化方案
|
Java 开发者
在Java多线程编程的世界里,Lock接口正逐渐成为高手们的首选,取代了传统的synchronized关键字
在Java多线程编程的世界里,Lock接口正逐渐成为高手们的首选,取代了传统的synchronized关键字
255 4
|
存储 安全 Java
Java面试题:请解释Java内存模型,并说明如何在多线程环境下使用synchronized关键字实现同步,阐述ConcurrentHashMap与HashMap的区别,以及它如何在并发环境中提高性能
Java面试题:请解释Java内存模型,并说明如何在多线程环境下使用synchronized关键字实现同步,阐述ConcurrentHashMap与HashMap的区别,以及它如何在并发环境中提高性能
257 0
|
安全 Java 开发者
Java多线程:synchronized关键字和ReentrantLock的区别,为什么我们可能需要使用ReentrantLock而不是synchronized?
Java多线程:synchronized关键字和ReentrantLock的区别,为什么我们可能需要使用ReentrantLock而不是synchronized?
438 0
|
安全 Java 编译器
Java多线程基础-6:线程安全问题及解决措施,synchronized关键字与volatile关键字(一)
线程安全问题是多线程编程中最典型的一类问题之一。如果多线程环境下代码运行的结果是符合我们预期的,即该结果正是在单线程环境中应该出现的结果,则说这个程序是线程安全的。 通俗来说,线程不安全指的就是某一代码在多线程环境下执行会出现bug,而在单线程环境下执行就不会。线程安全问题本质上是由于线程之间的调度顺序的不确定性,正是这样的不确定性,给我们的代码带来了很多“变数”。 本文将对Java多线程编程中,线程安全问题展开详细的讲解。
415 0
|
安全 Java 调度
Java多线程- synchronized关键字总结
Java多线程- synchronized关键字总结
201 0
|
安全 Java 数据安全/隐私保护
Java基础进阶多线程-线程安全和synchronized关键字
Java基础进阶多线程-线程安全和synchronized关键字
Java基础进阶多线程-线程安全和synchronized关键字
|
Java 数据安全/隐私保护
Java——多线程高并发系列之synchronized关键字
Java——多线程高并发系列之synchronized关键字
Java——多线程高并发系列之synchronized关键字

热门文章

最新文章