java-Runnable加锁实现生产者和消费者的多线程问题

Posted 随风的叶子

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了java-Runnable加锁实现生产者和消费者的多线程问题相关的知识,希望对你有一定的参考价值。

案例:

有一家商品售卖机构,只有一名生产者,两名消费者,请采用多线程的方式对这个案例进行实现。

 

//库存函数,保存着库存的信息Storage.java

public class Storage {
    //模拟库存
    public Integer num=1;
}


//生产者函数 product.java
/************************************************************   
Copyright (C), 1988-1999, Huawei Tech. Co., Ltd.   
FileName: Customer.java 
Author:     Light   
Version :    version1.0      
Date:       2018/7/11
Description:    生产者进行生产,生产者需要在消费者进行消费后生产,模拟的内存只有一块,
                当没有消费时,会提醒消费者消费,唤醒消费者进程 // 模块描述         
Version:         1.0// 版本信息 
  
Function List:     // 主要函数及其功能     
1.
 History: 
  // 历史修改记录 
      
    <author>  <time>   <version >   <desc>       
      Light    2018/7/11     1.0     build this moudle   

***********************************************************/
public class Product implements Runnable{
    private Storage storage;
    
    public Product(Storage storage) {
        super();
        this.storage = storage;
    }

    @Override
    public void run() {
        // TODO Auto-generated method stub
        while(true){
            synchronized (storage) {
                if(this.storage.num<1){
                    //模拟生产
                    this.storage.num++;
                    System.out.println("生产一个");
                    //唤醒队列中所有进程
                    this.storage.notifyAll();
                }else{
                    try {
                        //进入等待队列
                        this.storage.wait();
                    } catch (InterruptedException e) {
                        // TODO Auto-generated catch block
                        e.printStackTrace();
                    }
                }
            }
        }
    }

}

//消费者函数 Customer.java
/************************************************************   
Copyright (C), 1988-1999, Huawei Tech. Co., Ltd.   
FileName: Customer.java 
Author:     Light   
Version :    version1.0      
Date:       2018/7/11
Description:    消费者进行消费,消费者需要在生产者进行生产再进行消费,
                当没有生产时,会提醒生产者生产,唤醒生产者进程 // 模块描述         
Version:         1.0// 版本信息 
  
Function List:     // 主要函数及其功能     
1.
 History: 
  // 历史修改记录 
      
    <author>  <time>   <version >   <desc>       
      Light    2018/7/11     1.0     build this moudle   

***********************************************************/
public class Customer implements Runnable {
    private Storage storage;
    
    public Customer(Storage storage) {
        super();
        this.storage = storage;
    }
    /** 
      * 重写run()
      * @author     [Light](必须) 
      * @see      [run()](可选)  
      * @since     [version 1.0] (必须)  
      */ 
    @Override
    public void run() {
        // TODO Auto-generated method stub
        while(true){
            //加锁
            synchronized (storage) {
                //判断是否生产者进行了生产
                if(this.storage.num>=1){
                    //模拟消费
                    this.storage.num--;
                    System.out.println("消费一个");
                    //唤醒队列所有进程
                    this.storage.notifyAll();
                }else{
                    try {
                        //等待
                        this.storage.wait();
                    } catch (InterruptedException e) {
                        // TODO Auto-generated catch block
                        e.printStackTrace();
                    }
                }
            }
        }
    }

}

//主函数 MyTest.java
/************************************************************   
Copyright (C), 1988-1999, Huawei Tech. Co., Ltd.   
FileName: MyTest.java 
Author:     Light   
Version :    version1.0      
Date:       2018/7/11
Description:   消费生产进程模拟 // 模块描述         
Version:         1.0// 版本信息 
  
Function List:     // 主要函数及其功能     
1.
 History: 
  // 历史修改记录 
      
    <author>  <time>   <version >   <desc>       
      Light    2018/7/11     1.0     build this moudle   

***********************************************************/
public class MyTest {

    public static void main(String[] args) {
     //库存      Storage storage
=new Storage();
     //生产者 Product p1
=new Product(storage);
     //两名消费者 Customer c1
=new Customer(storage); Customer c2=new Customer(storage); Thread t1=new Thread(p1); Thread t2=new Thread(c1); Thread t3=new Thread(c2); t1.start(); t2.start(); t3.start();   } }

最终执行结果:

通过对进程的上锁和唤醒,最终实现了生产者和消费者的案例。

 

以上是关于java-Runnable加锁实现生产者和消费者的多线程问题的主要内容,如果未能解决你的问题,请参考以下文章

lockFreeQueue 无锁队列实现与总结

Java多线程-Lock锁的使用,以及生产者和消费者的实现

从生产者消费者窥探线程同步(下)

基于线程实现的生产者消费者模型(Object.wait(),Object.notify()方法)

C语言之简单使用互斥锁条件锁实现生产者消费者模型操作

JavaSE基础(十 一 )--<线程>线程同步,死锁,Lock锁,线程通信,生产消费问题,新增的线程创建方式