`
clearity
  • 浏览: 35510 次
  • 性别: 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模拟阻塞队列

    实现java模拟阻塞队列的例子,该代码包括,阻塞队列实现生产者,消费者。和模拟阻塞队列实现生产者及消费者模式,帮助你更好的理解java多线程

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

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

    Java并发编程:阻塞队列

    我们讨论了同步容器(Hashtable、Vector),也讨论了并发容器(ConcurrentHashMap、CopyOnWriteArrayList),这些工具都为我们编写多线程程序提供了很大的方便。我们来讨论另外一类容器:阻塞队列。  在前面我们...

    利用C++如何实现一个阻塞队列详解

    阻塞队列是多线程中常用的数据结构,对于实现多线程之间的数据交换、同步等有很大作用。 阻塞队列常用于生产者和消费者的场景,生产者是向队列里添加元素的线程,消费者是从队列里取元素的线程。简而言之,阻塞队列...

    java多线程实现轮流打印ABC

    使用多线程和阻塞队列实现了ABC字母按顺序轮流打印

    UDP+阻塞队列+多线程

    练习 Java 多线程编程技术。 练习实现网络并发服务的编程技术。 学习如何实现多线程间的相互同步和相互协作。 理解什么是线程安全。 二. 设计要求 功能概述:实现一个支持并发服务的网络运算服务器程序。该服务器...

    可以阻塞读的循环队列

    实现了一个多线程安全的循环队列,并能以阻塞方式出队,提供效率,

    BlockingQueue(阻塞队列)详解

    在新增的Concurrent包中,BlockingQueue...通过这些高效并且线程安全的队列类,为我们快速搭建高质量的多线程程序带来极大的便利。本文详细介绍了BlockingQueue家庭中的所有成员,包括他们各自的功能以及常见使用场景。

    Java多线程编程总结

    Java 线程系列博文总结word化,编目如下,欢迎互相学习交流: ...Java线程:新特征-阻塞队列 Java线程:新特征-阻塞栈 Java线程:新特征-条件变量 Java线程:新特征-原子量 Java线程:新特征-障碍器

    java多线程编程总结

    详细的讲述了多线程的各种用法 Java线程:概念与原理 Java线程:创建与启动 Java线程:线程栈模型与线程的变量 Java线程:线程状态的转换 Java线程:线程的同步与锁 Java线程:线程的交互 Java线程:线程的调度-休眠...

    java面试题_多线程(68题).pdf

    1. 什么是线程? 2. 什么是线程安全和线程不安全? 3. 什么是⾃旋锁? 4. 什么是CAS? 5. 什么是乐观锁和悲观锁? 6. 什么是AQS?...如何使⽤阻塞队列来实现⽣产者-消费者模型? 10. 什么是Callable和Future?

    手写一个线程安全的非阻塞队列,并且实现入队出队方法

    在往队列中添加元素的时候,新建一个节点,加入到队尾,加入到队尾的操作,利用CAS原理加乐观锁,另外,还需要将新加的节点设置为新的队尾,此步操作也需要利用CAS,head与tail变量用volatile修饰,保证多线程环境下...

    消息分发框架(基于JAVA阻塞队列实现、 生产者消费者模型)

    消息分发框架,基于java阻塞队列实现,生产者消费者模型 可用于任务分发,服务器消息消息,以及网络IO 性能优化,多线程

    IOS开发-多线程队列测试代码

    2.添加到队列的新task是同步运行(当前线程阻塞)还是异步(当前线程不阻塞) 3.多个队列之间的调度(此文章未涉及) // // 单线程和多线程并发队列测试(同步和异步) // // 基础原理: // 1)队列: // 1.1 dispatch_...

    10、阻塞队列BlockingQueue实战及其原理分析.pdf

    6.JUC并发工具类在大厂的应用场景详解 (1).pdf 7、深入理解 AQS 独占锁之 Reentrantlock 源码分析 (1).pdf 8、读写锁ReentrantReadWriteLock&StampLock详解.pdf ...10、阻塞队列BlockingQueue 实战及其原理分析.pdf

    Python实现简单多线程任务队列

    最近我在用梯度下降算法绘制神经网络的数据时,遇到了一些算法性能的问题。... 我不想用一个像 cerely(一种分布式任务队列)一样大而全的任务队列框架,因为框架对于我的这点需求来说太重了,并且我的绘图也并不

    CollectorReceiver.zip

    本资源是原始TCP接收目标数据,然后通过多线程处理后存放到阻塞队列,最后MFC的绘图线程从阻塞队列取出数据后显示到表格上。

Global site tag (gtag.js) - Google Analytics