版权声明:本文为博主原创文章,未经博主允许不得转载。 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();
}
}