生產與購買

--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();

}

 

}

相關文章
相關標籤/搜索