用阻塞队列(BlockingQueue)实现读写(生产者消费者)线程
2017-11-13 00:46
671 查看
package concurrent; import java.util.Scanner; import java.util.concurrent.BlockingQueue; import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; import java.util.concurrent.LinkedBlockingQueue; /** * @author: kimt * @Version: 1.0 * @date: 2017年11月12日 下午8:48:32 * @modify: * @Description:生产者和消费者之BlockingQueue(阻塞队列) */ public class ProducerAndComsumer { public static void main(String[] args) { BlockingQueue<String> bQueue = new LinkedBlockingQueue<>(); // 创建cached线程池 ExecutorService service = Executors.newFixedThreadPool(2); // 创建两个任务线程实例 WriteThread producer = new WriteThread(bQueue); ReadThread consumer = new ReadThread(bQueue); // 执行线程 //先执行消费者线程,阻塞队列没有数据,则进入阻塞状态 service.execute(consumer); service.execute(producer); } } /** * * 模拟生产者(写)线程 * */ class WriteThread implements Runnable { private BlockingQueue<String> bq; private boolean isRunning = false; public WriteThread(BlockingQueue<String> bq) { this.bq = bq; } @Override public void run() { isRunning = true; Scanner sr = null; while (isRunning) { System.out.println(Thread.currentThread()+"请输入数据:"); // 从键盘接收数据 sr = new Scanner(System.in); StringBuffer sb = new StringBuffer(); try { //模拟生产每次写入一行数据 if (sr.hasNextLine()) { sb.append(sr.nextLine()); } // 将数据写入阻塞队列中 bq.put(sb.toString()); } catch (InterruptedException e) { shutdown(); e.printStackTrace(); } } } public void shutdown() { isRunning = false; } } /** * * 模拟消费者(读)线程 * */ class ReadThread implements Runnable { private BlockingQueue<String> bq; private boolean isRunning = false; public ReadThread(BlockingQueue<String> bq) { this.bq = bq; } @Override public void run() { isRunning = true; while (isRunning) { try { // 将数据从阻塞队列取出,并且输出到控制台 String result = bq.take(); System.out.println(Thread.currentThread()+"已取得数据:" + result); } catch (InterruptedException e) { shutdown(); e.printStackTrace(); } } } public void shutdown() { isRunning = false; } }
相关文章推荐
- 用阻塞队列LinkedBlockingQueue实现生产者消费者先进先出
- java消费者生产者模式及JDK之阻塞队列LinkedBlockingQueue实现
- Java阻塞队列(BlockingQueue)实现 生产者/消费者 示例
- Java阻塞队列BlockingQueue实现生产者消费者-只有代码-不讲原理
- 阻塞队列BlockingQueue实现生产者-消费者模式值桌面搜索
- Java使用阻塞队列BlockingQueue实现生产者消费者
- 使用阻塞队列BlockingQueue实现生产者消费者
- 什么是阻塞队列?如何使用阻塞队列来实现生产者-消费者模型?
- 生产者与消费者的快速实现——并发队列ConcurrentLinkedQueue和阻塞队列LinkedBlockingQueue用法
- 11.python并发入门(part8 基于线程队列实现生产者消费者模型)
- 阻塞队列实现生产者消费者
- JAVA 阻塞队列实现 生产者和消费者 模式
- 基于Java阻塞队列实现生产者与消费者模式
- 使用阻塞队列实现生产者-消费者模式——Java实现
- 多线程+阻塞队列实现生产者-消费者模型获取队列数据问题
- 经典的生产者与消费者模型(基于BlockingQueue队列实现)
- Java生产者-消费者模式的非阻塞队列实现
- wait,notify,非阻塞队列实现生产者,消费者模型
- 生产者-消费者模式(阻塞队列实现)
- Java线程实现Redis任务队列(生产者消费者)