目錄
本次生產消費模型分別用synchronized和ReentrantLock實現
思路:分爲4部分,主程序、生產銷售管理,生產者線程,消費者線程。
生產銷售管理中有商品數組,當前庫存量,生產線方法,消費方法,分別在生產者和消費者run函數調用
主程序創建管理系統對象,初始化生產者,消費者,啓動線程。
1 定義生產者
class Generator implements Runnable {
private Admin admin;
public Generator(Admin admin) {
this.admin = admin;
}
public void run() {
for(int i = 1; i<= 25; i ++) {
String good = "商品" + i;
admin.generate(good);
}
}
}
2 定義消費者
class Consumer implements Runnable {
private Admin admin = null;
public Consumer(Admin admin) {
this.admin = admin;
}
public void run() {
for(int i = 1; i<= 25; i ++) {
admin.consume();
}
}
}
3 定義admin接口
interface Admin {
String[] GOODS = new String[6];
public void generate(String good);
public void consume();
}
4 SynchronizedAdmin實現
class SynchronizedAdmin implements Admin{
private int goodNum = 0;
{
System.out.println("測試SynchronizedAdmin");
}
//同步鎖實現同步,同步監視器調用wait、notify方法實現通信
public synchronized void generate(String good) {
try {
if(goodNum == GOODS.length) {
//讓出線程,釋放資源
this.wait();
}
Thread.sleep(100);
} catch (InterruptedException e) {
e.printStackTrace();
}
GOODS[goodNum] = good;
goodNum ++;
System.out.println("生產線正在生產第" + goodNum + "個商品,商品名是:" + GOODS[goodNum - 1]);
//喚醒當前對象池中等待的一個線程。
this.notify();
}
public synchronized void consume() {
try {
if(goodNum == 0) {
// 讓出線程,釋放資源
this.wait();
}
Thread.sleep(100);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("正在消費第" + goodNum + "個商品,商品名是:" + GOODS[goodNum - 1]);
goodNum--;
//喚醒當前對象池中等待的一個線程。
this.notify();
}
}
5 ReentrantLockAdmin實現
class ReentrantLockAdmin implements Admin {
private int goodNum = 0;
private Lock lock = new ReentrantLock();
private Condition condition = lock.newCondition();
{
System.out.println("測試ReentrantLockAdmin");
}
//重入鎖實現同步,condition的await、signal實現通信
public void generate(String good) {
lock.lock();
try {
if(goodNum == GOODS.length) {
// 讓出線程,釋放資源
condition.await();
}
Thread.sleep(100);
GOODS[goodNum] = good;
goodNum ++;
System.out.println("生產線正在生產第" + goodNum + "個商品,商品名是:" + GOODS[goodNum - 1]);
//喚醒當前對象池中等待的一個線程。
condition.signal();
} catch (InterruptedException e) {
e.printStackTrace();
}finally{
lock.unlock();
}
}
public void consume() {
lock.lock();
try {
if(goodNum == 0) {
//讓出線程,釋放資源
condition.await();
}
Thread.sleep(100);
System.out.println("正在消費第" + goodNum + "個商品,商品名是:" + GOODS[goodNum - 1]);
goodNum --;
//喚醒當前對象池中等待的一個線程。
condition.signal();
} catch (InterruptedException e) {
e.printStackTrace();
}finally{
lock.unlock();
}
}
}
6 測試程序
public static void main(String[] args) {
//測試同步鎖管理系統
//Admin admin = new SynchronizedAdmin();
//測試重入鎖管理系統
Admin admin = new ReentrantLockAdmin();
Generator generator = new Generator(admin);
Thread thr1 = new Thread(generator);
Consumer con = new Consumer(admin);
Thread thr2 = new Thread(con);
thr1.start();
thr2.start();
}