Q.怎么去实现使用独立的进程去生成奇偶数,然后另一个线程打印出奇偶数之和?
A.可以通过多线程以及BlockingQueue来实现。队列是先进先出的数据结构。
阻塞队列有以下特性
1.线程从空队列中获取时,只有在其他线程往队列中放入有效数据后才会返回,否则阻塞
2.线程往一个已满队列中放数据时,只有其他线程取出数据腾出空间,或者其他线程清空了队列以后才会添加成功,否则阻塞
下面是奇偶数生成类
import java.util.concurrent.ArrayBlockingQueue; import java.util.concurrent.BlockingQueue; public class NumberWriter extends Thread { private BlockingQueue<Integer> queue; private int maxNumber; private boolean isEvenNumber; public NumberWriter(BlockingQueue<Integer> queue, int maxNumber, boolean isEvenNumber) { this.queue = queue; this.maxNumber = maxNumber; this.isEvenNumber = isEvenNumber; } public void run() { int i = 1; while (i <= maxNumber) { try { if (isEvenNumber && (i % 2) == 0) { queue.put(i); // enqueue } else if (!isEvenNumber && i%2 != 0) { queue.put(i); } ++i; } catch (InterruptedException ie) { ie.printStackTrace(); } } } public static void main(String[] args) { final int MAX_NUM = 100; BlockingQueue<Integer> oddNumberQueue = new ArrayBlockingQueue<Integer>(10); BlockingQueue<Integer> evenNumberQueue = new ArrayBlockingQueue<Integer>(10); NumberWriter oddGen = new NumberWriter(oddNumberQueue, MAX_NUM, false); NumberWriter evenGen = new NumberWriter(evenNumberQueue, MAX_NUM, true); NumberReceiver receiver = new NumberReceiver(oddNumberQueue, evenNumberQueue); oddGen.start(); evenGen.start(); receiver.start(); } }
线程会汇总奇偶数之和,然后将结果打印出来
import java.util.concurrent.BlockingQueue; public class NumberReceiver extends Thread { private BlockingQueue<Integer> oddNumberQueue; private BlockingQueue<Integer> evenNumberQueue; public NumberReceiver(BlockingQueue<Integer> oddNumberQueue, BlockingQueue<Integer> evenNumberQueue) { this.oddNumberQueue = oddNumberQueue; this.evenNumberQueue = evenNumberQueue; } public void run() { int odd = 0, even = 0; try { while (odd != -1) { odd = oddNumberQueue.take(); //dequeue - FIFO even = evenNumberQueue.take(); //dequeue - FIFO if ((odd + even) % 5 == 0) { System.out.println("match found " + odd + " + " + even + " = " + (odd + even)); } } } catch (InterruptedException ie) { ie.printStackTrace(); System.exit(1); } } }
输出结果:
match found 7 + 8 = 15 match found 17 + 18 = 35 match found 27 + 28 = 55 match found 37 + 38 = 75 match found 47 + 48 = 95 match found 57 + 58 = 115 match found 67 + 68 = 135 match found 77 + 78 = 155 match found 87 + 88 = 175 match found 97 + 98 = 195
相关推荐
支持多线程的阻塞队列,使用模板技术,可存储任意类型数据
实现java模拟阻塞队列的例子,该代码包括,阻塞队列实现生产者,消费者。和模拟阻塞队列实现生产者及消费者模式,帮助你更好的理解java多线程
实现消息队列的关键因素是考量不同线程访问消息队列的同步问题。本实现涉及到几个知识点 std::lock_guard 介绍 std::lock_gurad 是 C++11 中定义的模板类。定义如下: template <class> class lock_guard; lock_...
我们讨论了同步容器(Hashtable、Vector),也讨论了并发容器(ConcurrentHashMap、CopyOnWriteArrayList),这些工具都为我们编写多线程程序提供了很大的方便。我们来讨论另外一类容器:阻塞队列。 在前面我们...
阻塞队列是多线程中常用的数据结构,对于实现多线程之间的数据交换、同步等有很大作用。 阻塞队列常用于生产者和消费者的场景,生产者是向队列里添加元素的线程,消费者是从队列里取元素的线程。简而言之,阻塞队列...
使用多线程和阻塞队列实现了ABC字母按顺序轮流打印
练习 Java 多线程编程技术。 练习实现网络并发服务的编程技术。 学习如何实现多线程间的相互同步和相互协作。 理解什么是线程安全。 二. 设计要求 功能概述:实现一个支持并发服务的网络运算服务器程序。该服务器...
实现了一个多线程安全的循环队列,并能以阻塞方式出队,提供效率,
在新增的Concurrent包中,BlockingQueue...通过这些高效并且线程安全的队列类,为我们快速搭建高质量的多线程程序带来极大的便利。本文详细介绍了BlockingQueue家庭中的所有成员,包括他们各自的功能以及常见使用场景。
Java 线程系列博文总结word化,编目如下,欢迎互相学习交流: ...Java线程:新特征-阻塞队列 Java线程:新特征-阻塞栈 Java线程:新特征-条件变量 Java线程:新特征-原子量 Java线程:新特征-障碍器
详细的讲述了多线程的各种用法 Java线程:概念与原理 Java线程:创建与启动 Java线程:线程栈模型与线程的变量 Java线程:线程状态的转换 Java线程:线程的同步与锁 Java线程:线程的交互 Java线程:线程的调度-休眠...
1. 什么是线程? 2. 什么是线程安全和线程不安全? 3. 什么是⾃旋锁? 4. 什么是CAS? 5. 什么是乐观锁和悲观锁? 6. 什么是AQS?...如何使⽤阻塞队列来实现⽣产者-消费者模型? 10. 什么是Callable和Future?
在往队列中添加元素的时候,新建一个节点,加入到队尾,加入到队尾的操作,利用CAS原理加乐观锁,另外,还需要将新加的节点设置为新的队尾,此步操作也需要利用CAS,head与tail变量用volatile修饰,保证多线程环境下...
消息分发框架,基于java阻塞队列实现,生产者消费者模型 可用于任务分发,服务器消息消息,以及网络IO 性能优化,多线程
2.添加到队列的新task是同步运行(当前线程阻塞)还是异步(当前线程不阻塞) 3.多个队列之间的调度(此文章未涉及) // // 单线程和多线程并发队列测试(同步和异步) // // 基础原理: // 1)队列: // 1.1 dispatch_...
6.JUC并发工具类在大厂的应用场景详解 (1).pdf 7、深入理解 AQS 独占锁之 Reentrantlock 源码分析 (1).pdf 8、读写锁ReentrantReadWriteLock&StampLock详解.pdf ...10、阻塞队列BlockingQueue 实战及其原理分析.pdf
最近我在用梯度下降算法绘制神经网络的数据时,遇到了一些算法性能的问题。... 我不想用一个像 cerely(一种分布式任务队列)一样大而全的任务队列框架,因为框架对于我的这点需求来说太重了,并且我的绘图也并不
本资源是原始TCP接收目标数据,然后通过多线程处理后存放到阻塞队列,最后MFC的绘图线程从阻塞队列取出数据后显示到表格上。