一、创建生产者
public class Provider implements Runnable{
// 阻塞队列
private BlockingQueue<Integer> queue;
private int i = 0;
public Provider() {
}
public Provider(BlockingQueue queue) {
this.queue = queue;
}
@Override
public void run() {
try {
for (int j = 0;j < 50;j++){
// offer方法 如果队列是满的则5秒中在放入,5秒后队列还是满则返回false 放入成功则返回true
//queue.offer(5,1,TimeUnit.SECONDS);
// put方法 等到队列有空位置则放入队列,否则此线程一直堵塞
queue.put(j);
// 模仿业务需要消耗的时间
Thread.sleep(100);
System.out.println("放入成功" + j);
}
}catch (Exception e){
e.printStackTrace();
}
}
}
二、创建消费者
public class Consumers implements Runnable {
private BlockingQueue<Integer> queue;
private volatile Boolean running = true;
public Consumers(BlockingQueue<Integer> queue) {
this.queue = queue;
}
@Override
public void run() {
try{
while(running){
// poll方法 在一秒持续去从对列里面去取,1秒后队列没有对象则取出来为null
Integer test = this.queue.poll(1,TimeUnit.SECONDS);
// take方法 队列里面有对象则取出来,没有对象则此线程阻塞,直到队列里面有对象
//Integer test = this.queue.take();
Thread.sleep(200);
if (test != null){
System.out.println("消费成功"+test);
}else{
System.out.println("消费完毕"+test);
running = false;
}
}
}catch (Exception e){
e.printStackTrace();
}finally {
System.out.println("退出消费者线程!-----");
}
}
}
三、执行
public static void main(String[] args) throws Exception{
BlockingQueue<Integer> queue = new LinkedBlockingQueue<Integer>(1000);
// 使用线程池进行任务
ExecutorService service = Executors.newCachedThreadPool();
service.execute(new Provider(queue));
service.execute(new Consumers(queue));
service.execute(new Consumers(queue));
service.execute(new Consumers(queue));
service.shutdown();
}