BlockingQueue的使用

一个线程从队列里取数据,一个线程往队列里添加数据

import java.util.concurrent.Exchanger;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;

public class ExchangerTest {

    public static void main(String[] args) {
        ExecutorService service = Executors.newCachedThreadPool();
        final Exchanger<String> exchanger = new Exchanger<String>();
        service.execute(new Runnable() {

            @Override
            public void run() {
                try {
                    String data1 = "zxx";
                    System.out.println("线程" + Thread.currentThread().getName()
                            + "正在把数据" + data1 + "换出去");
                    Thread.sleep((long) Math.random() * 10000);
                    
                    String data2=(String) exchanger.exchange(data1);
                    System.out.println("线程" + Thread.currentThread().getName()
                            + "换回的数据为" + data2);
                } catch (Exception e) {

                    e.printStackTrace();
                }
            }
        });

        service.execute(new Runnable() {

            @Override
            public void run() {
                try {
                    String data1 = "lhm";
                    System.out.println("线程" + Thread.currentThread().getName()
                            + "正在把数据" + data1 + "换出去");
                    Thread.sleep((long) Math.random() * 10000);
                    
                    String data2=(String) exchanger.exchange(data1);
                    System.out.println("线程" + Thread.currentThread().getName()
                            + "换回的数据为" + data2);
                } catch (Exception e) {

                    e.printStackTrace();
                }
            }
        });
    }
}

长度为1的阻塞队列实现同步通知

import java.util.concurrent.ArrayBlockingQueue;
import java.util.concurrent.BlockingQueue;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;

public class BlockingQueueCondition {

    public static void main(String[] args) {
        ExecutorService service = Executors.newSingleThreadExecutor();
        final Business3 business = new Business3();
        service.execute(new Runnable(){

            public void run() {
                for(int i=0;i<50;i++){
                    business.sub();
                }
            }
            
        });
        
        for(int i=0;i<50;i++){
            business.main();
        }
    }

}

class Business3{
    BlockingQueue<Integer> subQueue = new ArrayBlockingQueue<Integer>(1);
    BlockingQueue<Integer> mainQueue = new ArrayBlockingQueue<Integer>(1);
    //这里是匿名构造方法,只要new一个对象都会调用这个匿名构造方法,它与静态块不同,静态块只会执行一次,
    //在类第一次加载到JVM的时候执行
    //这里主要是让main线程首先put一个,就有东西可以取,如果不加这个匿名构造方法put一个的话程序就死锁了
    {
        try {
            mainQueue.put(1);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }
    public void sub(){
        try
        {
            mainQueue.take();
            for(int i=0;i<10;i++){
                System.out.println(Thread.currentThread().getName() + " : " + i);
            }
            subQueue.put(1);
        }catch(Exception e){

        }
    }
    
    public void main(){
        
        try
        {
            subQueue.take();
            for(int i=0;i<5;i++){
                System.out.println(Thread.currentThread().getName() + " : " + i);
            }
            mainQueue.put(1);
        }catch(Exception e){
        }        
    }
}

本文出自 “点滴积累” 博客,请务必保留此出处http://tianxingzhe.blog.51cto.com/3390077/1716903

时间: 2024-10-30 00:43:35

BlockingQueue的使用的相关文章

Java中Queue和BlockingQueue的区别

1.BlockingQueue:支持两个附加操作的 Queue,这两个操作是:检索元素时等待队列变为非空,以及存储元素时等待空间变得可用. 2.BlockingQueue 不接受 null 元素. 3.BlockingQueue 可以是限定容量的. 4.BlockingQueue 实现是线程安全的.Queue不是线程安全的.因此可以将Blockingqueue用于用于生产者-使用者队列. 根据Api修改的一个例子,大家可以修改自己体验BlockingQueue的使用 package test;

从一个故障说说Java的三个BlockingQueue

最近出了个故障,排查的时候耗费了很长的时间,回顾整个排查过程,经验主义在这里起了不好的作用,直接导致了整个故障排查的时间非常长,这个故障的根本原因在于BlockingQueue用的有问题,顺带展开说说Java中常用的几个BlockingQueue:ArrayBlockingQueue.LinkedBlockingQueue和SynchronousQueue. 当时故障的现象是应用处理请求的线程池满了,导致请求处理不了,于是dump线程,看线程都在做什么,结果发现线程都Block在写日志的地方,以

【Java并发之】BlockingQueue

本文主要讲的是并发包中涉及到的集合,关于普通集合,请参考[java 集合概览] 一.什么是BlockingQueue BlockingQueue即阻塞队列,从阻塞这个词可以看出,在某些情况下对阻塞队列的访问可能会造成阻塞.被阻塞的情况主要有如下两种: 1. 当队列满了的时候进行入队列操作 2. 当队列空了的时候进行出队列操作 因此,当一个线程试图对一个已经满了的队列进行入队列操作时,它将会被阻塞,除非有另一个线程做了出队列操作:同样,当一个线程试图对一个空队列进行出队列操作时,它将会被阻塞,除非

谈谈java的BlockingQueue

    最近在维护一个java工程,在群里面也就聊起来java的优劣!无奈一些Java的终极粉丝,总是号称性能已经不必C++差,并且很多标准类库都是大师级的人写的,如何如何稳定等等.索性就认真研究一番,他们给我的一项说明就是,在线程之间投递消息,用java已经封装好的BlockingQueue,就足够用了.       既然足够用那就写代码测试喽,简简单单写一个小程序做了一番测试: //默认包 import java.util.concurrent.*; import base.MyRunnab

Java4Android之BlockingQueue

在研究Smack的源代码的时候,我对它的连接Connection以及派生类XMPPConnection的关注是最多的,因为一个即时通信程序,它的网络模块必是它的核心.而我很在乎它是如何实现的. 在收发数据包的时候,我看到了队列的身影.BlockingQueue和ArrayBlockingQueue.所以,我觉得用到什么然后去查阅,去记录,这种方法是比较高效率的. BlockingQueue是在Java的新的Concurrent包中的. Reference: http://www.cnblogs.

线程 同步-Android BlockingQueue使用

问题描述 Android BlockingQueue使用 在Android应用中,需要间隔一段时间,收集一些信息存入本地文件.为了避免多线程问题,使用BlockingQueue,采集的时候使用多线程,写文件用一个线程. 问题是: 使用blockingQueue后,写文件的线程需要不断的从BlockingQueue中读取信息,使用的是死循环.因为不知道程序什么时候退出,所以没有办法停止从Queue中读取信息的线程.就是请问如何停止从Queue中读取信息的线程. 解决方案 您需要一个管理所有收集线程

阻塞队列BlockingQueue用法(转)

多线程环境中,通过队列可以很容易实现数据共享,比如经典的"生产者"和"消费者"模型中,通过队列可以很便利地实现两者之间的数据共享. 假设我们有若干生产者线程,另外又有若干个消费者线程.如果生产者线程需要把准备好的数据共享给消费者线程,利用队列的方式来传递数据,就可以很方便地解决他们之间的数据共享问题.但如果生产者和消费者在某个时间段内,万一发生数据处理速度不匹配的情况呢?理想情况下,如果生产者产出数据的速度大于消费者消费的速度,并且当生产出来的数据累积到一定程度的时

Java并发(四)BlockingQueue的使用

    wait()和notifyAll()方法以一种非常低级的方式解决了任务互操作的问题,即每次交互时都需要握手.在许多情况下,你可以瞄准更高的抽象级别,使用同步队列来解决任务协作的问题.同步队列在任何时刻都只允许一个任务插入或移除元素.在java.util.concurrent.BlockingQueue接口中提供了这个队列,这个接口有大量的标准实现.你通常可以使用LinkedBlockingQueue,它是一个无届队列,你还可以使用ArrayBlockingQueue,它具有固定的尺寸,因

ThreadPoolExecutor使用和思考(上)-线程池大小设置与BlockingQueue的三种实现区别(转)

工作中多处接触到了ThreadPoolExecutor.趁着现在还算空,学习总结一下. 前记: jdk官方文档(javadoc)是学习的最好,最权威的参考. 文章分上中下.上篇中主要介绍ThreadPoolExecutor接受任务相关的两方面入参的意义和区别,池大小参数corePoolSize和maximumPoolSize,BlockingQueue选型(SynchronousQueue,LinkedBlockingQueue,ArrayBlockingQueue):中篇中主要聊聊与keepA