您的位置:首页 > 编程语言 > Java开发

java多线程解决生产者消费者问题

2016-04-27 11:03 543 查看

/*
*生产者和消费者案例
*/
publicclassTestProductorAndConsumer{

publicstaticvoidmain(String[]args){
Clerkclerk=newClerk();

Productorpro=newProductor(clerk);
Consumercus=newConsumer(clerk);

newThread(pro,"生产者A").start();
newThread(cus,"消费者B").start();
}

}

//店员
classClerk{
privateintproduct=0;

//进货
publicsynchronizedvoidget(){//循环次数:0
while(product>=1){//为了避免虚假唤醒问题,应该总是使用在循环中
System.out.println("产品已满!");

try{
this.wait();
}catch(InterruptedExceptione){
}

}

System.out.println(Thread.currentThread().getName()+":"+++product);
this.notifyAll();
}

//卖货
publicsynchronizedvoidsale(){//product=0;循环次数:0
while(product<=0){
System.out.println("缺货!");

try{
this.wait();
}catch(InterruptedExceptione){
}
}

System.out.println(Thread.currentThread().getName()+":"+--product);
this.notifyAll();
}
}

//生产者
classProductorimplementsRunnable{
privateClerkclerk;

publicProductor(Clerkclerk){
this.clerk=clerk;
}

@Override
publicvoidrun(){
for(inti=0;i<20;i++){
try{
Thread.sleep(200);
}catch(InterruptedExceptione){
}

clerk.get();
}
}
}

//消费者
classConsumerimplementsRunnable{
privateClerkclerk;

publicConsumer(Clerkclerk){
this.clerk=clerk;
}

@Override
publicvoidrun(){
for(inti=0;i<20;i++){
clerk.sale();
}
}
}



上边代码主要介绍了java多线程解决生产者消费者问题的方法,实例分析了java采用多线程的方法解决生产者消费者问题的相关技巧,需要的朋友可以参考下

另外concurrent包下面在执行多线程的时候也给出了特性阻塞队列BlockingQueue用法如下:也可以实现生产者和消费者模式

importjava.util.concurrent.BlockingQueue;
importjava.util.concurrent.LinkedBlockingQueue;

publicclassTest{
publicstaticvoidmain(String[]args){
//固定容器大小为10
BlockingQueue<Food>foods=newLinkedBlockingQueue<Food>(10);
Threadproduce=newThread(newProduce(foods));
Threadconsume=newThread(newConsume(foods));
produce.start();
consume.start();
}
}

/**
*生产者
*/
classProduceimplementsRunnable{
privateBlockingQueue<Food>foods;

Produce(BlockingQueue<Food>foods){
this.foods=foods;
}

@Override
publicvoidrun(){
inti=0;
while(i<=10){
try{
//当生产的食品数量装满了容器,那么在while里面该食品容器(阻塞队列)会自动阻塞wait状态等待消费
foods.put(newFood("食品"+i));
i++;
}catch(InterruptedExceptione){
e.printStackTrace();//TochangebodyofcatchstatementuseFile|Settings|FileTemplates.
}
}
}
}

/**
*消费者
*/
classConsumeimplementsRunnable{
privateBlockingQueue<Food>foods;

Consume(BlockingQueue<Food>foods){
this.foods=foods;
}

@Override
publicvoidrun(){
try{
Thread.sleep(1000);//用于测试当生产者生产满10个食品后是否进入等待状态
while(true){
//当容器里面的食品数量为空时,那么在while里面该食品容器(阻塞队列)会自动阻塞wait状态等待生产
Foodfood=foods.take();
System.out.println("消费"+food.getName());
}
}catch(InterruptedExceptione){
e.printStackTrace();//TochangebodyofcatchstatementuseFile|Settings|FileTemplates.
}
}
}

/**
*食品
*/
classFood{
privateStringname;

StringgetName(){
returnname;
}

Food(Stringname){
this.name=name;
System.out.println("生产"+name);
}
}


  
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: