`
clearity
  • 浏览: 36918 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

多线程与阻塞队列

 
阅读更多

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

 

  • 大小: 38.3 KB
分享到:
评论

相关推荐

    支持多线程和泛型的阻塞队列

    阻塞队列是一种在多线程编程中广泛使用的并发数据结构,它在计算机科学和编程领域,特别是Java和C++等面向对象语言中扮演着重要角色。标题中的“支持多线程和泛型的阻塞队列”意味着我们讨论的是一个能够同时处理多...

    java模拟阻塞队列

    Java中的阻塞队列是一种基于同步原语的高级数据结构,它在多线程编程中扮演着重要角色,尤其在并发处理和优化系统资源利用率方面。阻塞队列结合了队列的数据结构与线程同步机制,使得生产者可以在队列满时被阻塞,而...

    多线程操作日志队列

    在多线程日志处理中,队列充当了生产者和消费者之间的缓冲区,确保了日志的顺序,并防止了生产者过快导致的内存溢出或者消费者过慢导致的阻塞。 3. **线程执行器(Thread Pool)**:线程执行器,也称为线程池,是...

    多线程 队列利用

    2. **阻塞队列**:一种常见的队列实现是阻塞队列,当队列为空时,尝试取元素的线程会被阻塞,直到有新的元素加入;同样,当队列满时,试图插入元素的线程也会被阻塞。这样可以防止资源浪费,线程可以根据队列的状态...

    c++11 实现的阻塞队列

    C++11 中的阻塞队列是指在多线程环境下,实现生产者消费者模式的队列。阻塞队列的实现需要解决两个问题:线程安全和阻塞机制。在 C++11 中,我们可以使用 std::mutex、std::condition_variable 和 std::queue 等标准...

    C#多线程不阻塞

    在.NET编程中,多线程和异步处理是提高应用程序性能和响应能力的关键技术。本文主要探讨了如何在C#中实现非阻塞的异步方法调用,以避免线程阻塞,从而提高程序效率。 首先,我们需要理解同步与异步调用的区别。同步...

    workquere工作队列 多线程

    工作队列(Work Queue)是一种在多线程编程中广泛使用的模式,用于协调并发任务的执行,优化系统资源的利用并提高程序的响应速度。在C#中,工作队列通常用于将耗时的任务放入队列,然后由一组后台线程来处理这些任务...

    CollectorReceiver.zip

    《基于多线程与阻塞队列的数据处理与可视化》 在现代计算机系统中,高效地处理并发任务和数据传输是至关重要的。本资源“CollectorReceiver.zip”提供了一个实例,展示了如何利用多线程和阻塞队列技术来实现一个TCP...

    阻塞队列阻塞队列阻塞队列

    在Java编程语言中,阻塞队列是一种线程安全的数据结构,它在多线程并发控制中发挥着重要作用。阻塞队列的核心特性是当队列为空时,尝试获取元素的线程会被阻塞,直到其他线程添加元素;同样,当队列满时,试图插入...

    并发-线程池和阻塞队列.pdf

    阻塞队列为线程间通信提供了便捷的机制,可以用来协调多个线程的运行,防止多线程直接访问共享资源导致的并发问题。例如,生产者-消费者问题就可以通过阻塞队列来优雅地解决。生产者在队列满时会被阻塞,直到队列有...

    java线程聊天室(阻塞队列实现)

    总结来说,"java线程聊天室(阻塞队列实现)"项目中,主要涉及了Java多线程技术、阻塞队列的数据结构以及基于HTTP session的用户身份验证。通过合理运用这些技术,可以构建出高效、安全的多用户聊天系统。

    多线程任务队列

    在编程领域,尤其是在性能敏感的系统中,多线程任务队列是一种常见且重要的设计模式。这个主题主要涉及C++编程语言,它利用了C++的特性来实现高效的并发处理。下面将详细介绍“多线程任务队列”的概念、工作原理以及...

    BlockingQueue(阻塞队列)详解

    ### BlockingQueue(阻塞队列)详解 #### 一、前言 随着现代软件系统对并发性能需求的不断提高,多线程编程技术逐渐成为开发人员不可或缺的技能之一。在Java平台中,`java.util.concurrent`包提供了丰富的工具来...

    java 多线程 队列工厂

    阻塞队列在多线程环境中特别有用,因为它允许线程在队列满时等待,直到有空间可用;同样,当队列为空时,取元素的线程也会被阻塞,直到有新的元素插入。 常见的`BlockingQueue`实现包括`ArrayBlockingQueue`、`...

    14-阻塞队列BlockingQueue实战及其原理分析二.pdf

    2. 需要更多的同步机制:阻塞队列需要更多的同步机制来避免线程之间的冲突。 阻塞队列是一种非常有用的数据结构,它可以帮助我们解决很多问题,但是也需要我们小心地使用它,以免引起更多的问题。

    多线程使用消息队列

    **多线程与消息队列的结合** 在多线程环境中使用消息队列,可以进一步优化系统性能和可扩展性。例如,一个线程可以负责将任务放入消息队列,其他线程则作为消费者从队列中取出任务并处理。这种方式可以实现任务的...

    并发-线程池和阻塞队列

    在Java编程中,"并发-线程池和阻塞队列"是两个核心概念,它们在多线程环境下处理任务调度和数据同步方面发挥着重要作用。线程池是一种管理线程资源的有效方式,而阻塞队列则常用于线程间通信和数据共享。 线程池...

    java多线程加队列上传文件_后台处理

    2. **阻塞队列**:利用`BlockingQueue`接口实现的队列,如`ArrayBlockingQueue`、`LinkedBlockingQueue`等,可以确保当队列满时,新添加的任务会阻塞等待,直到有空闲空间为止;同样,当队列为空时,从队列中取出...

    C++基于消息队列的多线程实现示例代码

    实现消息队列的关键因素是考量不同线程访问消息队列的同步问题。本实现涉及到几个知识点 std::lock_guard 介绍 std::lock_gurad 是 C++11 中定义的模板类。定义如下: template &lt;class&gt; class lock_guard; lock_...

    Java实现简单的阻塞队列2种方式

    在Java编程中,阻塞队列是一种特殊类型的并发数据结构,它在多线程环境中的应用广泛,主要用于线程间的协作通信。阻塞队列在队列满时会阻止生产者线程添加元素,在队列空时会阻止消费者线程取出元素,直到条件满足...

Global site tag (gtag.js) - Google Analytics