zoukankan      html  css  js  c++  java
  • java高级---->Thread之BlockingQueue的使用

      今天我们通过实例来学习一下BlockingQueue的用法。梦想,可以天花乱坠,理想,是我们一步一个脚印踩出来的坎坷道路。

    BlockingQueue的实例

    官方文档上的对于BlockingQueue的说明:

    A Queue that additionally supports operations that wait for the queue to become non-empty when retrieving an element, and wait for space to become available in the queue when storing an element.

    如果BlockQueue是空的,从BlockingQueue取东西的操作将会被阻断进入等待状态,直到BlockingQueue进了东西才会被唤醒.同样,如果BlockingQueue是满的,任何试图往里存东西的操作也会被阻断进入等待状态,直到BlockingQueue里有空间才会被唤醒继续操作

    一、BlockingQueue的简单使用

    package com.linux.huhx.concurreny;
    
    import java.util.Random;
    import java.util.concurrent.BlockingQueue;
    import java.util.concurrent.LinkedBlockingDeque;
    import java.util.concurrent.TimeUnit;
    
    public class BlockingQueueTest {
        public static void main(String[] args) {
            BlockingQueue q = new LinkedBlockingDeque();
            Producer p = new Producer(q);
            Consumer c1 = new Consumer(q);
            Consumer c2 = new Consumer(q);
            new Thread(p).start();
            new Thread(c1).start();
            new Thread(c2).start();
        }
    
        static class Producer implements Runnable {
            private final BlockingQueue<String> queue;
            Producer(BlockingQueue<String> queue) {
                this.queue = queue;
            }
            @Override
            public void run() {
                for (int i = 0; i < 4; i++) {
                    try {
                        queue.put("producer" + i);
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                }
            }
        }
    
        static class Consumer implements Runnable {
            private final BlockingQueue queue;
            Consumer(BlockingQueue queue) {
                this.queue = queue;
            }
            public void run() {
                for (int i = 0; i < 2; i++) {
                    try {
                        TimeUnit.MILLISECONDS.sleep(new Random().nextInt(2000));
                        System.out.println(queue.take());
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                }
            }
        }
    }

    运行的结果如下:使用put和take方法,打印的结果是固定的。它会阻塞。

    producer0
    producer1
    producer2
    producer3

    二、ArrayBlockIngQueue的使用

    package com.linux.thread.thread;
    
    import org.junit.Test;
    
    import java.util.concurrent.ArrayBlockingQueue;
    
    public class ArrayBlockQueueTest {
        @Test
        public void put() {
            try {
                ArrayBlockingQueue<String> queue = new ArrayBlockingQueue<String>(3);
                queue.put("huhx");
                queue.put("linux");
                queue.put("ll");
                System.out.println("size: " + queue.size());
                System.out.println("begin: " + System.currentTimeMillis());
                queue.put("tomhu"); // 阻塞
                System.out.println("end: " + System.currentTimeMillis());
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
    
        @Test
        public void get() {
            try {
                ArrayBlockingQueue<String> queue = new ArrayBlockingQueue<String>(3);
                System.out.println("begin: " + System.currentTimeMillis());
                System.out.println(queue.take()); // 阻塞
                System.out.println("end: " + System.currentTimeMillis());
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
    }

    友情链接

  • 相关阅读:
    Day 20 初识面向对象
    Day 16 常用模块
    Day 15 正则表达式 re模块
    D14 模块 导入模块 开发目录规范
    Day 13 迭代器,生成器,内置函数
    Day 12 递归,二分算法,推导式,匿名函数
    Day 11 闭包函数.装饰器
    D10 函数(二) 嵌套,命名空间作用域
    D09 函数(一) 返回值,参数
    Day 07 Day08 字符编码与文件处理
  • 原文地址:https://www.cnblogs.com/huhx/p/baseusejavaBlockingQueue.html
Copyright © 2011-2022 走看看