生产者和消费者 用Lock控制多线程共享资源

package org.java.Thread;


import java.util.concurrent.Semaphore;
import java.util.concurrent.locks.ReentrantLock;


public class MultiThread {
//定义一个仓库的容量
private final int MAX_SIZE = 100;
//定义一个显著仓库的商品的数量
private int current;

//用锁自动控制线程
ReentrantLock  lock = new ReentrantLock();

//数据仓库的构造方法
//初始化他的现在库存量
public MultiThread(int current){
this.current = current;
}

//仓库是一个共享资源,所以定义两个方法,存放商品和销售商品

public void produce(int produceNum){
//下面要获得这个仓库的人工锁
lock.lock();

try {
//获得生产者的名字
String name = Thread.currentThread().getName();
while((current+produceNum)>MAX_SIZE){

System.out.println("仓库现在的商品量是:"+current+","+name+"不能把自己生产的"+produceNum+"个商品放入仓库了,不然就爆仓了");

lock.unlock();

try {
//为什么要休眠10秒,因为自己不满足条件,不要那么那么快就去抢资源
//抢来了,仓库也放不了生产的商品
Thread.sleep(10);
//在这里挂起,等待得到资源,和其他线程一样,抢资源
lock.lock();
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}

}
current += produceNum;
System.out.println(name+"把自己生产的"+produceNum+"个商品放入仓库中!");
System.out.println("现在仓库的商品量是:"+current);
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}finally{
//执行完
lock.unlock();
}


}

//销售商品
public  void reduce(int reduceNum){
//下面要获得这个仓库的人工锁
lock.lock();

try {
String name = Thread.currentThread().getName();
while((current-reduceNum)<0){
System.out.println("仓库现在的商品量是:"+current+","+name+"不能从仓库拿走"+reduceNum+"个商品");
lock.unlock();
try {
Thread.sleep(10);
lock.lock();
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}

}
current -= reduceNum;
System.out.println(name+"从仓库中拿走了"+reduceNum+"个商品!");
System.out.println("现在仓库的商品量是:"+current);
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}finally{
lock.unlock();
}

}

public static void main(String[] args){
MultiThread mul = new MultiThread(30);
Producer p1 = new Producer("p1",10,mul);
Producer p2 = new Producer("p2",20,mul);
Producer p3 = new Producer("p3",30,mul);
Producer p4 = new Producer("p4",40,mul);
Producer p5 = new Producer("p5",50,mul);
Consumer c1 = new Consumer("c1",20,mul);
Consumer c2 = new Consumer("c2",30,mul);
Consumer c5 = new Consumer("c5",50,mul);
Consumer c3 = new Consumer("c3",40,mul);
Consumer c4 = new Consumer("c4",40,mul);

p1.start();
p2.start();
p3.start();
p4.start();
p5.start();
c1.start();
c2.start();
c3.start();
c4.start();
c5.start();

}
}


class Producer extends Thread{
//生产的商品个数
private int produceNum;
private String name;
private MultiThread multiThread;


public Producer(String name,int produceNum, MultiThread multiThread) {
super(name);
this.name = name;
this.produceNum = produceNum;
this.multiThread = multiThread;
}

public void run(){
System.out.println(name+"打算把最近生产的"+produceNum+"个商品放入仓库中");
multiThread.produce(produceNum);
}
}


class Consumer extends Thread{
//生产的商品个数
private int reduceNum;
private String name;
private MultiThread multiThread;


public Consumer(String name,int reduceNum, MultiThread multiThread) {
super(name);
this.name = name;
this.reduceNum = reduceNum;
this.multiThread = multiThread;
}

public void run(){
System.out.println(name+"准备去仓库里拿走"+reduceNum+"个商品");
multiThread.reduce(reduceNum);
}
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值