多執行緒初探之使用Lock實現生產-消費模式
阿新 • • 發佈:2018-12-13
前言
在上篇文章中使用的是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();
}
}