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();
      }
}

目录
相关文章
|
21小时前
|
消息中间件 缓存 NoSQL
Java多线程实战-CompletableFuture异步编程优化查询接口响应速度
Java多线程实战-CompletableFuture异步编程优化查询接口响应速度
|
23小时前
|
数据采集 存储 Java
高德地图爬虫实践:Java多线程并发处理策略
高德地图爬虫实践:Java多线程并发处理策略
|
1天前
|
缓存 Java
【Java基础】简说多线程(上)
【Java基础】简说多线程(上)
5 0
|
2天前
|
安全 Java 编译器
是时候来唠一唠synchronized关键字了,Java多线程的必问考点!
本文简要介绍了Java中的`synchronized`关键字,它是用于保证多线程环境下的同步,解决原子性、可见性和顺序性问题。从JDK1.6开始,synchronized进行了优化,性能得到提升,现在仍可在项目中使用。synchronized有三种用法:修饰实例方法、静态方法和代码块。文章还讨论了synchronized修饰代码块的锁对象、静态与非静态方法调用的互斥性,以及构造方法不能被同步修饰。此外,通过反汇编展示了`synchronized`在方法和代码块上的底层实现,涉及ObjectMonitor和monitorenter/monitorexit指令。
15 0
|
16天前
|
存储 Java 数据库连接
java多线程之线程通信
java多线程之线程通信
|
28天前
|
存储 缓存 NoSQL
Redis单线程已经很快了6.0引入多线程
Redis单线程已经很快了6.0引入多线程
31 3
|
30天前
|
消息中间件 安全 Linux
线程同步与IPC:单进程多线程环境下的选择与权衡
线程同步与IPC:单进程多线程环境下的选择与权衡
58 0
|
1月前
|
Java 调度 C#
C#学习系列相关之多线程(一)----常用多线程方法总结
C#学习系列相关之多线程(一)----常用多线程方法总结
|
1月前
|
安全 编译器 C#
C#学习相关系列之多线程---lock线程锁的用法
C#学习相关系列之多线程---lock线程锁的用法
|
1月前
|
Java C#
C#学习系列相关之多线程(五)----线程池ThreadPool用法
C#学习系列相关之多线程(五)----线程池ThreadPool用法