Java并发多线程编程——生产者消费者模式示例(传统版本)

x33g5p2x  于2022-02-07 转载在 Java  
字(1.4k)|赞(0)|评价(0)|浏览(363)

一、生产者消费者模式示例代码

  • 示例需求
一个初始值为0的变量 两个线程交替操作 一个加1 一个减1 每个线程遍历5轮
  • 示例代码
import java.util.concurrent.locks.Condition;
import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock;
/**
 * 共享资源类
 */
class ShareData{
    //一个初始值为0的变量
    private int num =0;

    private Lock lock=new ReentrantLock();
    private Condition condition =lock.newCondition();

    //变量+1方法
    public void increment() throws Exception {
        //加锁
        lock.lock();
        try {
            //判断
            while(num !=0){
                //等待 不生产
                condition.await();
            }
            //生产
            num++;
            System.out.println(Thread.currentThread().getName()+"递增," + "\t" + "数量:"+num);
            //通知唤醒
            condition.signalAll();
        }finally {
            //解锁
            lock.unlock();
        }
    }
    //变量-1方法
    public void decrement() throws Exception {
        //加锁
        lock.lock();
        try {
            //判断
            while(num ==0){
                //等待 不生产
                condition.await();
            }
            //减产
            num--;
            System.out.println(Thread.currentThread().getName()+"递减," + "\t" + "数量:"+num);
            //通知唤醒
            condition.signalAll();
        }finally {
            //解锁
            lock.unlock();
        }
    }
}

/**
 * @description: 生产者消费者模式示例代码(传统版)
 *               一个初始值为0的变量 两个线程交替操作 一个加1 一个减1 每个线程遍历5轮
 * @author: xz
 */
public class ProdConsumerTraditionDemo {
    public static void main(String[] args) {
        ShareData shareData = new ShareData();
        //A线程调用变量+1方法
        new Thread(() -> {
            for (int i = 1; i <= 5; i++) {
                try {
                    shareData.increment();
                } catch (Exception e) {
                    e.printStackTrace();
                }
            }
        }, "A线程").start();

        //B线程调用变量-1方法
        new Thread(() -> {
            for (int i = 1; i <= 5; i++) {
                try {
                    shareData.decrement();
                } catch (Exception e) {
                    e.printStackTrace();
                }
            }
        }, "B线程").start();

    }
}
  • 输出结果如下图:

相关文章