java 消费者 生产者 队列_用Java写一个生产者-消费者队列

packageyunche.test.producer;importjava.util.LinkedList;importjava.util.Random;/*** @ClassName: Producer

* @Description: 生产者

*@author: yunche

* @date: 2018/08/26*/

public class Producer implementsRunnable

{private final LinkedListlist;/*** 缓冲区大小*/

private final intmaxSize;public Producer(LinkedList list, intsize)

{this.list =list;

maxSize=size;

}

@Overridepublic voidrun()

{try{while(true)

{//模拟耗时1s

Thread.sleep(1000);synchronized(list)

{if(list.size()==maxSize)

{

System.out.println("缓冲区已满,正在等待消费者消费..." +System.currentTimeMillis());

list.wait();

}else{

list.add(produce());

list.notifyAll();

}

}

}

}catch(InterruptedException e)

{

e.printStackTrace();

}

}private intproduce()

{int n = new Random().nextInt(10000);

System.out.println("Thread: " + Thread.currentThread().getName() + " produce: " +n);returnn;

}

}packageyunche.test.producer;importjava.util.Date;importjava.util.LinkedList;/*** @ClassName: Consumer

* @Description: 消费者

*@author: yunche

* @date: 2018/08/26*/

public class Consumer implementsRunnable

{private final LinkedListlist;publicConsumer(LinkedList list)

{this.list =list;

}

@Overridepublic voidrun()

{while (true)

{try{synchronized(list)

{//模拟耗时

Thread.sleep(1000);if(list.isEmpty())

{

System.out.println("缓冲区已空,正在等待生产者生产..." + System.currentTimeMillis() +Thread.currentThread().getName());

list.wait();

}else{

consume(list.poll());

list.notifyAll();

}

}

}catch(InterruptedException e)

{

e.printStackTrace();

}

}

}private voidconsume(Integer n)

{

System.out.println("Thread:" + Thread.currentThread().getName() + " consume: " +n);

}

}packageyunche.test.producer;importjava.util.ArrayList;importjava.util.LinkedList;importjava.util.List;/*** @ClassName: Main

* @Description: 测试类

*@author: yunche

* @date: 2018/08/26*/

public classMain

{public static voidmain(String[] args)

{

LinkedList list = new LinkedList<>();

Producer p= new Producer(list, 10);

Consumer c1= newConsumer(list);

Consumer c2= newConsumer(list);

Thread producer= newThread(p);

producer.setName("生产者线程");

Thread consumer1= newThread(c1);

consumer1.setName("消费者1");

Thread consumer2= newThread(c2);

consumer2.setName("消费者2");

producer.start();

consumer1.start();

consumer2.start();

}

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值