前言
在上篇文章中使用的是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();
- }
- }