多线程初探之使用Lock实现生产-消费模式

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/qq_22271479/article/details/78596172

前言

在上篇文章中使用的是wait和notify以及synchronized关键字配合实现了线程间的通知,实现了生产-消费模型。本篇文章将使用Lock技术来实现上述模型。

Lock介绍

Lock是jdk1.5的产物,在此之前我们只能使用synchronized关键字来进行同步,但是synchronized是一个悲观锁机制,不能响应中断。Lock是一个接口,用户需要手动申请锁,手动释放锁,通过Condition类来完成线程的暂停以及唤醒其他线程的工作。

实现Manager

package com.yzz.java;

import java.util.concurrent.locks.Condition;
import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock;

public class Manager {

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

    public void product(int a) {
        try {
            lock.lock();
            while (count < 100) {
                if (count > a) {
                    System.out.println("线程" + Thread.currentThread().getName() + "生产者需要生产" + a + "件商品 count:" + count+"等待");
                    condition.await();
                }
                count += a;
                condition.signalAll();
                System.out.println("线程" + Thread.currentThread().getName() + "生产者生产了" + a + "件商品 count:" + count);
            }
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            lock.unlock();
        }
    }

    public void custum(int b) {
        try {
            lock.lock();
            if (count < b) {
                System.out.println("线程" + Thread.currentThread().getName() + "生产者需要消费" + b + "件商品 count:" + count+"等待");
                condition.await();
            }else{
                count -= b;
                condition.signalAll();
                System.out.println("线程" + Thread.currentThread().getName() + "消费者消费了" + b + "件商品 count:" + count);
            }
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            lock.unlock();
        }
    }
}

实现生产者


package com.yzz.java;

public class Producter extends Thread{

    private Manager manager;
    private int b;
    public Producter(Manager manager,int b,String name) {
        this.manager = manager;
        this.b = b;
        setName(name);
    }

    @Override
    public void run() {
        super.run();
        manager.product(b);
    }
}

实现消费者


package com.yzz.java;

public class Consumer extends Thread{

    private Manager manager;
    private int a;
    public Consumer(Manager manager,int a,String name) {
        this.manager = manager;
        this.a = a;
        setName(name);
    }

    @Override
    public void run() {
        super.run();
        manager.custum(a);
    }
}

测试

package com.yzz.java;

public class Test {

    public static void main(String[] args) {
        Manager manager = new Manager();
        Producter producter1 = new Producter(manager,2,"生产者1");
        Producter producter2 = new Producter(manager,1,"生产者2");
        Producter producter3 = new Producter(manager,1,"生产者3");

        Consumer consumer1 = new Consumer(manager, 12, "消费者1");
        Consumer consumer2 = new Consumer(manager, 23, "消费者2");
        Consumer consumer3 = new Consumer(manager, 1, "消费者3");
        Consumer consumer4 = new Consumer(manager, 3, "消费者4");
        Consumer consumer5 = new Consumer(manager, 8, "消费者5");
        Consumer consumer6 = new Consumer(manager, 46, "消费者6");

        producter1.start();
        producter2.start();
        producter3.start();

        consumer1.start();
        consumer2.start();
        consumer3.start();
        consumer4.start();
        consumer5.start();
        consumer6.start();
    }
}

这里写图片描述

猜你喜欢

转载自blog.csdn.net/qq_22271479/article/details/78596172