您的位置:首页 > 产品设计 > UI/UE

Java阻塞队列BlockingQueue的使用

2016-08-02 12:51 513 查看
使用阻塞队列BlockingQueue实现模拟生产消费关系:

import java.util.concurrent.BlockingQueue;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.LinkedBlockingQueue;

/**
* 生产消费问题
* @author 周孟军 时间:2016年8月2日 下午12:51:40
*
*/
public class BlockingQueueDemo {

/**
* 定义装苹果的篮子
*/
class Basket {
// 篮子 能够容纳3个苹果
BlockingQueue<String> basket = new LinkedBlockingQueue<String>(3);

// 生产苹果 -->放入篮子
public void produce() throws InterruptedException {
basket.put("1 apple");
}

// 消费苹果--->从篮子中取出
public String consume() throws InterruptedException {
// take方法 取出一个苹果 如果 bakset 为空 等到 有苹果为止 (获取并以处队列的头部)
return basket.take();
}
}

// 定义苹果的生产者 线程接口
class Producer implements Runnable {

private String instance;
private Basket basket;

public Producer(String instance, Basket basket) {
super();
this.instance = instance;
this.basket = basket;
}

@Override
public void run() {
try {
while (true) {
System.out.println("生产者准备生产苹果" + instance);
basket.produce();
System.out.println("生产者生产苹果完毕" + instance);
// 休眠300MS
Thread.sleep(300);
}

} catch (InterruptedException e) {
System.out.println("Producer InterruptedException");
}

}
}

class Consumer implements Runnable {
private String instance;
private Basket basket;

public Consumer(String instance, Basket basket) {
super();
this.instance = instance;
this.basket = basket;
}

@Override
public void run() {

try {
while (true) {
// 消费苹果
System.out.println("消费者注备消费苹果:" + instance);
System.out.println(basket.consume());
System.out.println("消费者消费苹果完毕" + instance);
Thread.sleep(300);
}
} catch (Exception e) {
System.out.println("Consumer InterruptedException");
}
}

}

public static void main(String[] args) {
// 创建最外面的类
BlockingQueueDemo test = new BlockingQueueDemo();
// 篮子
Basket basket = test.new Basket();
// 生产者
Producer producer1 = test.new Producer("生产者1", basket);
Producer producer2 = test.new Producer("生产者2", basket);
Consumer consumer = test.new Consumer("消费者1", basket);
// 创建线程池
ExecutorService service = Executors.newCachedThreadPool();
service.submit(producer1);
service.submit(producer2);
service.submit(consumer);

// 程序运行5秒后停止 所有任务

try {
Thread.sleep(5000);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
// 结束所有 线程
service.shutdownNow();
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: