--java
package cn.demo01;dom
import java.util.Random;ide
import java.util.concurrent.ExecutorService;spa
import java.util.concurrent.Executors;線程
import java.util.concurrent.locks.Condition;ci
import java.util.concurrent.locks.Lock;開發
import java.util.concurrent.locks.ReentrantLock;產品
public class Demo05_Goods {it
private Object[] goods = new Object[1]; // 1:聲明產品庫io
// 2:開發一個方法用於向goods裏面產產品,用一個線程不斷的調用這個方法
private Lock lock = new ReentrantLock();
private Condition con = lock.newCondition();
public void make() {
lock.lock();
try {
while (goods[0] != null) {
try {
con.await();//
} catch (InterruptedException e) {
e.printStackTrace();
}
}
int a = new Random().nextInt(100);// 0~99之間的任意值
goods[0] = a;
System.err.println("生產一個產品:" + goods[0]);
// 生產完成之後,就去通知購買人能夠購買了
con.signal();
} finally {
lock.unlock();
}
}
// 3:開發一個方法不斷的去購買
public void buy() {
lock.lock();
try {
// 判斷若是沒有沒有產品,就去等
while (goods[0] == null) {
try {
con.await();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
Object obj = goods[0];
goods[0] = null;
System.err.println("---------------------------購買到一個產品:" + obj);
con.signalAll();
} finally {
lock.unlock();
}
}
public Demo05_Goods() {
ExecutorService es = Executors.newCachedThreadPool();
es.execute(new Runnable() {
@Override
public void run() {
while (true) {
make();
try {
Thread.sleep(100 * new Random().nextInt(4));
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
});
es.execute(new Runnable() {
@Override
public void run() {
while (true) {
buy();
try {
Thread.sleep(100 * new Random().nextInt(4));
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
});
}
public static void main(String[] args) {
new Demo05_Goods();
}
}