目录
本次生产消费模型分别用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();
}