9_1_Java实现的BlockingQueue队列

package com.nowcoder;

import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.boot.test.SpringApplicationConfiguration;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;

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

/**
 * Created by Administrator on 2017/5/9.
 */
public class MyThread {

    class Producer implements Runnable{
        private BlockingQueue<String> p;

        public Producer(BlockingQueue p){
            this.p = p;
        }

        @Override
        public void run() {

            try {
                for (int i = 0; i < 10; i++){
                    Thread.sleep(1000);
                    p.put(String.valueOf(i));
                }
            }catch (Exception e){
                    e.printStackTrace();
            }
        }
    }

    class Consumer implements Runnable{

        private BlockingQueue<String> c;

        public Consumer(BlockingQueue c){
            this.c = c;
        }

        @Override
        public void run() {
            while (true){
                try {
                    System.out.println(Thread.currentThread().getName() +":" + c.take());
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }

        }
    }

    public void testBlockingQueue(){
        BlockingQueue<String> blockingQueue = new ArrayBlockingQueue<String>(10);
        new Thread(new Producer(blockingQueue)).start();
        new Thread(new Consumer(blockingQueue), "consumer1").start();
        new Thread(new Consumer(blockingQueue), "consumer2").start();

    }

    public static void main(String[] args){
        new MyThread().testBlockingQueue();
    }

}
时间: 2024-12-29 19:32:23

9_1_Java实现的BlockingQueue队列的相关文章

BlockingQueue队列学习

今天看了下BlockingQueue的几种实现,记录下以便以后复习. 首先来看一下BlockingQueue的家族成员: BlockingQueue除了先进先出外,还有两个操作:在队列为空时,获取元素的线程会等待队列变为非空.当队列满时,存储元素的线程会等待队列可用.阻塞队列常用于生产者和消费者的场景,生产者是往队列里添加元素的线程,消费者是从队列里拿元素的线程.阻塞队列就是生产者存放元素的容器,而消费者也只从容器里拿元素. 阻塞队列提供了四种处理方法: 方法\处理方式 抛出异常 返回特殊值 一

BlockingQueue:队列(FIFO)

阻塞队列: 非阻塞队列: ArrayBlockingQueue:阻塞队列 1.add(Object):将Object加入到队列中,如果队列可以 容纳,则返回true,否则抛出异常 2.offer(Object):表示如果可能的话,将Object加入到 队列中,如果能放进去,返回true,否则,返回false 3.put(Object):将Object加入到队列,如果队列没有 空间,调用次方法的线程被阻塞直到队列中有空间再继续 4.poll(time):取走队列中排在首位的元素对象,如果 队列为空

java-线程-使用阻塞队列(BlockingQueue)控制线程通信

BlockingQueue是一个接口,也是Queue的子接口.BlockingQueue具有一个特征:当生产者线程试图向BlockingQueue中放入元素时,如果该队列已满,则线程被阻塞:但消费者线程试图从BlockingQueue中取出元素时,如果队列已空,则该线程阻塞. 程序的两个线程通过交替向BlockingQueue中放入元素.取出元素,即可很好地控制线程的通信. BlockingQueue提供如下两个支持阻塞的方法: put(E e):尝试把Eu元素放如BlockingQueue中,

队列BlockingQueue的简单例子

队列,当进行多线程编程的时候,很多时候可能会用到,队列是先进先出的,我们可以将要执行的任务放置在队列内缓存起来,当线程池中线程可以使用的时候,我们就从队列中获取一个任务执行.. 当前是一个队列的简单例子. package com.chen.queue; import java.util.HashMap; import java.util.Map; import java.util.Random; import java.util.concurrent.BlockingQueue; import

java 阻塞队列BlockingQueue

java中阻塞BlockingQueue 接口实现类中用的较多的通常是ArrayBlockingQueue,LinkedBlockingQueue.它们都是线程安全的.ArrayBlockingQueue以数组的形式存储,LinkedBlockingQueue以node节点的方式进行存储. 开发中如果队列的插入操作比较频繁建议使用LinkedBlockingQueue,因为每个node节点都有一个前后指针,插入新元素仅需要变更前后的指针引用即可, ArrayBlockingQueue插入新元素,

java.util.concurrent 包笔记 --- BlockingQueue

BlockingQueue 队列接口,具有 4 组不同的方法用于插入.移除以及对队列中的元素进行检查.如果请求的操作不能得到立即执行的话,每个方法的表现也不同.这些方法如下:   Throws exception Special value Blocks Times out Insert add(e) offer(e) put(e) offer(e, time, unit) Remove remove() poll() take() poll(time, unit) Examine elemen

JAVA队列的使用

JAVA队列的使用 今天跟大家来看看如何在项目中使用队列.首先我们要知道使用队列的目的是什么?一般情况下,如果是一些及时消息的处理,并且处理时间很短的情况下是不需要使用队列的,直接阻塞式的方法调用就可以了.但是,如果在消息处理的时候特别费时间,这个时候如果有新的消息来了,就只能处于阻塞状态,造成用户等待.这个时候在项目中引入队列是十分有必要的.当我们接受到消息后,先把消息放到队列中,然后再用新的线程进行处理,这个时候就不会有消息的阻塞了.下面就跟大家介绍两种队列的使用,一种是基于内存的,一种是基

10个经典的Java面试题集合

1.Java的HashMap是如何工作的? HashMap是一个针对数据结构的键值,每个键都会有相应的值,关键是识别这样的值. HashMap 基于 hashing 原理,我们通过 put ()和 get ()方法储存和获取对象.当我们将键值对传递给 put ()方法时,它调用键对象的 hashCode ()方法来计算 hashcode,让后找到 bucket 位置来储存值对象.当获取对象时,通过键对象的 equals ()方法找到正确的键值对,然后返回值对象.HashMap 使用 Linked

线程通信

线程通信 一 使用Synchronized的线程 1.当线程在系统内运行时,线程的调度具有一定的透明性,程序通常无法准确控制线程的轮换执行,但java也提供了一些机制来保证线程协调运行.Object类提供了wait(),notify()和notifyAll()三个方法,这三个方法属于Object类,但是必须由同步监视器来调用,可以分为以下两种情况:(1)对于使用synchronized修饰的同步方法,因为该类的默认实例this就是同步监视器,所以可以在同步方法中直接调用这三个方法(2)对于使用s