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和C++等面向对象语言中扮演着重要角色。标题中的“支持多线程和泛型的阻塞队列”意味着我们讨论的是一个能够同时处理多...
Java中的阻塞队列是一种基于同步原语的高级数据结构,它在多线程编程中扮演着重要角色,尤其在并发处理和优化系统资源利用率方面。阻塞队列结合了队列的数据结构与线程同步机制,使得生产者可以在队列满时被阻塞,而...
在多线程日志处理中,队列充当了生产者和消费者之间的缓冲区,确保了日志的顺序,并防止了生产者过快导致的内存溢出或者消费者过慢导致的阻塞。 3. **线程执行器(Thread Pool)**:线程执行器,也称为线程池,是...
2. **阻塞队列**:一种常见的队列实现是阻塞队列,当队列为空时,尝试取元素的线程会被阻塞,直到有新的元素加入;同样,当队列满时,试图插入元素的线程也会被阻塞。这样可以防止资源浪费,线程可以根据队列的状态...
C++11 中的阻塞队列是指在多线程环境下,实现生产者消费者模式的队列。阻塞队列的实现需要解决两个问题:线程安全和阻塞机制。在 C++11 中,我们可以使用 std::mutex、std::condition_variable 和 std::queue 等标准...
在.NET编程中,多线程和异步处理是提高应用程序性能和响应能力的关键技术。本文主要探讨了如何在C#中实现非阻塞的异步方法调用,以避免线程阻塞,从而提高程序效率。 首先,我们需要理解同步与异步调用的区别。同步...
工作队列(Work Queue)是一种在多线程编程中广泛使用的模式,用于协调并发任务的执行,优化系统资源的利用并提高程序的响应速度。在C#中,工作队列通常用于将耗时的任务放入队列,然后由一组后台线程来处理这些任务...
《基于多线程与阻塞队列的数据处理与可视化》 在现代计算机系统中,高效地处理并发任务和数据传输是至关重要的。本资源“CollectorReceiver.zip”提供了一个实例,展示了如何利用多线程和阻塞队列技术来实现一个TCP...
在Java编程语言中,阻塞队列是一种线程安全的数据结构,它在多线程并发控制中发挥着重要作用。阻塞队列的核心特性是当队列为空时,尝试获取元素的线程会被阻塞,直到其他线程添加元素;同样,当队列满时,试图插入...
阻塞队列为线程间通信提供了便捷的机制,可以用来协调多个线程的运行,防止多线程直接访问共享资源导致的并发问题。例如,生产者-消费者问题就可以通过阻塞队列来优雅地解决。生产者在队列满时会被阻塞,直到队列有...
总结来说,"java线程聊天室(阻塞队列实现)"项目中,主要涉及了Java多线程技术、阻塞队列的数据结构以及基于HTTP session的用户身份验证。通过合理运用这些技术,可以构建出高效、安全的多用户聊天系统。
在编程领域,尤其是在性能敏感的系统中,多线程任务队列是一种常见且重要的设计模式。这个主题主要涉及C++编程语言,它利用了C++的特性来实现高效的并发处理。下面将详细介绍“多线程任务队列”的概念、工作原理以及...
### BlockingQueue(阻塞队列)详解 #### 一、前言 随着现代软件系统对并发性能需求的不断提高,多线程编程技术逐渐成为开发人员不可或缺的技能之一。在Java平台中,`java.util.concurrent`包提供了丰富的工具来...
阻塞队列在多线程环境中特别有用,因为它允许线程在队列满时等待,直到有空间可用;同样,当队列为空时,取元素的线程也会被阻塞,直到有新的元素插入。 常见的`BlockingQueue`实现包括`ArrayBlockingQueue`、`...
2. 需要更多的同步机制:阻塞队列需要更多的同步机制来避免线程之间的冲突。 阻塞队列是一种非常有用的数据结构,它可以帮助我们解决很多问题,但是也需要我们小心地使用它,以免引起更多的问题。
**多线程与消息队列的结合** 在多线程环境中使用消息队列,可以进一步优化系统性能和可扩展性。例如,一个线程可以负责将任务放入消息队列,其他线程则作为消费者从队列中取出任务并处理。这种方式可以实现任务的...
在Java编程中,"并发-线程池和阻塞队列"是两个核心概念,它们在多线程环境下处理任务调度和数据同步方面发挥着重要作用。线程池是一种管理线程资源的有效方式,而阻塞队列则常用于线程间通信和数据共享。 线程池...
2. **阻塞队列**:利用`BlockingQueue`接口实现的队列,如`ArrayBlockingQueue`、`LinkedBlockingQueue`等,可以确保当队列满时,新添加的任务会阻塞等待,直到有空闲空间为止;同样,当队列为空时,从队列中取出...
实现消息队列的关键因素是考量不同线程访问消息队列的同步问题。本实现涉及到几个知识点 std::lock_guard 介绍 std::lock_gurad 是 C++11 中定义的模板类。定义如下: template <class> class lock_guard; lock_...
在Java编程中,阻塞队列是一种特殊类型的并发数据结构,它在多线程环境中的应用广泛,主要用于线程间的协作通信。阻塞队列在队列满时会阻止生产者线程添加元素,在队列空时会阻止消费者线程取出元素,直到条件满足...