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,如需转载请自行联系原作者
目录
相关文章
|
5月前
|
安全 算法 Java
Java 多线程:线程安全与同步控制的深度解析
本文介绍了 Java 多线程开发的关键技术,涵盖线程的创建与启动、线程安全问题及其解决方案,包括 synchronized 关键字、原子类和线程间通信机制。通过示例代码讲解了多线程编程中的常见问题与优化方法,帮助开发者提升程序性能与稳定性。
230 0
|
6月前
|
Java 数据挖掘 调度
Java 多线程创建零基础入门新手指南:从零开始全面学习多线程创建方法
本文从零基础角度出发,深入浅出地讲解Java多线程的创建方式。内容涵盖继承`Thread`类、实现`Runnable`接口、使用`Callable`和`Future`接口以及线程池的创建与管理等核心知识点。通过代码示例与应用场景分析,帮助读者理解每种方式的特点及适用场景,理论结合实践,轻松掌握Java多线程编程 essentials。
414 5
|
6月前
|
监控 搜索推荐 Java
Java 多线程最新实操技术与应用场景全解析:从基础到进阶
本文深入探讨了Java多线程的现代并发编程技术,涵盖Java 8+新特性,如CompletableFuture异步处理、Stream并行流操作,以及Reactive编程中的Reactor框架。通过具体代码示例,讲解了异步任务组合、并行流优化及响应式编程的核心概念(Flux与Mono)。同时对比了同步、CompletableFuture和Reactor三种实现方式的性能,并总结了最佳实践,帮助开发者构建高效、扩展性强的应用。资源地址:[点击下载](https://pan.quark.cn/s/14fcf913bae6)。
416 3
|
2月前
|
Java
如何在Java中进行多线程编程
Java多线程编程常用方式包括:继承Thread类、实现Runnable接口、Callable接口(可返回结果)及使用线程池。推荐线程池以提升性能,避免频繁创建线程。结合同步与通信机制,可有效管理并发任务。
169 6
|
5月前
|
Java API 微服务
为什么虚拟线程将改变Java并发编程?
为什么虚拟线程将改变Java并发编程?
309 83
|
2月前
|
Java 调度 数据库
Python threading模块:多线程编程的实战指南
本文深入讲解Python多线程编程,涵盖threading模块的核心用法:线程创建、生命周期、同步机制(锁、信号量、条件变量)、线程通信(队列)、守护线程与线程池应用。结合实战案例,如多线程下载器,帮助开发者提升程序并发性能,适用于I/O密集型任务处理。
292 0
|
3月前
|
算法 Java
Java多线程编程:实现线程间数据共享机制
以上就是Java中几种主要处理多线程序列化资源以及协调各自独立运行但需相互配合以完成任务threads 的技术手段与策略。正确应用上述技术将大大增强你程序稳定性与效率同时也降低bug出现率因此深刻理解每项技术背后理论至关重要.
269 16
|
7月前
|
机器学习/深度学习 消息中间件 存储
【高薪程序员必看】万字长文拆解Java并发编程!(9-2):并发工具-线程池
🌟 ​大家好,我是摘星!​ 🌟今天为大家带来的是并发编程中的强力并发工具-线程池,废话不多说让我们直接开始。
283 0
|
10月前
|
Linux
Linux编程: 在业务线程中注册和处理Linux信号
通过本文,您可以了解如何在业务线程中注册和处理Linux信号。正确处理信号可以提高程序的健壮性和稳定性。希望这些内容能帮助您更好地理解和应用Linux信号处理机制。
203 26
|
10月前
|
Linux
Linux编程: 在业务线程中注册和处理Linux信号
本文详细介绍了如何在Linux中通过在业务线程中注册和处理信号。我们讨论了信号的基本概念,并通过完整的代码示例展示了在业务线程中注册和处理信号的方法。通过正确地使用信号处理机制,可以提高程序的健壮性和响应能力。希望本文能帮助您更好地理解和应用Linux信号处理,提高开发效率和代码质量。
208 17