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();
}
}
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();
}
}
相关文章推荐
- Java使用阻塞队列BlockingQueue实现线程同步
- Java使用阻塞队列BlockingQueue实现生产者消费者
- 学习java多线程的笔记3-使用BlockingQueue阻塞队列来模拟两个线程之间的通信
- Java多线程____BlockingQueue阻塞队列使用
- Java中 BlockingQueue(阻塞队列)的使用
- java阻塞队列BlockingQueue使用实例
- java使用阻塞队列(BlockingQueue)来控制线程通信
- Java -- 使用阻塞队列(BlockingQueue)控制线程通信
- java消费者生产者模式及JDK之阻塞队列LinkedBlockingQueue实现
- JAVA线程池ThreadPoolExecutor与阻塞队列BlockingQueue
- 线程通信---使用阻塞队列(BlockingQueue)控制线程通信
- 黑马程序员——Java多线程—线程同步—阻塞队列:BlockingQueue
- Java线程(十三):BlockingQueue-线程的阻塞队列
- Java线程(篇外篇):阻塞队列BlockingQueue
- Java之美[从菜鸟到高手演练]之Java中阻塞队列的使用
- java 阻塞队列BlockingQueue
- Java阻塞队列BlockingQueue实现生产者消费者-只有代码-不讲原理
- Java线程:阻塞队列BlockingQueue
- java点滴之阻塞队列:PriorityBlockingQueue,SynchronousQueue,LinkedBlockingQueue,ArrayBlockingQueue
- Java阻塞队列(BlockingQueue)实现 生产者/消费者 示例