zoukankan      html  css  js  c++  java
  • 并发新构件之PriorityBlockingQueue:优先阻塞队列

    PriorityBlockingQueue:优先阻塞队列;是带有优先级的阻塞队列,一个无界阻塞队列,它使用与类 PriorityQueue 相同的顺序规则,并且提供了阻塞获取操作。虽然此队列逻辑上是无界的,但是资源被耗尽时试图执行 add 操作也将失败(导致 OutOfMemoryError)。此类不允许使用 null 元素。依赖自然顺序的优先级队列也不允许插入不可比较的对象(这样做会导致抛出 ClassCastException)。

    package com.houjun.current.newClassBank;
    
    import java.util.ArrayList;
    import java.util.List;
    import java.util.Queue;
    import java.util.Random;
    import java.util.concurrent.ExecutorService;
    import java.util.concurrent.Executors;
    import java.util.concurrent.PriorityBlockingQueue;
    import java.util.concurrent.TimeUnit;
    
    /**
     * @Author: HouJun
     * @Date: 2019/10/18 8:31
     * @Description: 测试优先阻塞队列
     * @version: 1.0
     */
    public class PriorityBlockingQueueDemo {
        public static void main(String[] args) throws InterruptedException {
            ExecutorService exec = Executors.newCachedThreadPool();
            PriorityBlockingQueue<Runnable> priorityBlockingQueue = new PriorityBlockingQueue<>();
            exec.execute(new PrioritizedTaskProducer(priorityBlockingQueue, exec));
    //        TimeUnit.SECONDS.sleep(4);
            exec.execute(new PrioritizedTaskConsumer(priorityBlockingQueue));
    
        }
    }
    
    //可加入优先队列的对象,
    class PrioritizedTask implements Runnable, Comparable<PrioritizedTask> {
        Random random = new Random(47);
        private static int counter = 0;
        private final int id = counter++;
        private final int priority;
        protected static List<PrioritizedTask> sequence = new ArrayList<>();
    
        public PrioritizedTask(int priority) {
            this.priority = priority;
            sequence.add(this);
        }
    
    
        @Override
        public void run() {
            try {
                TimeUnit.MILLISECONDS.sleep(random.nextInt(250));
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            System.out.println(this);
        }
    
        @Override
        public String toString() {
            return String.format("[%1$-3d]", priority) + " Task " + id;
        }
    
        public String summary() {
            return "(" + id + " : " + priority + ")";
        }
    
        @Override//这样就是升序
        public int compareTo(PrioritizedTask o) {
            if (priority > o.priority)//这样就是升序
                return 1;
            if (priority < o.priority)//这样就是升序
                return -1;
            return 0;
        }
    }
    
    //生产者,向优先队列中添加对象
    class PrioritizedTaskProducer implements Runnable {
        Random random = new Random(47);
        private Queue<Runnable> queue;
        private ExecutorService executorService;
    
        public PrioritizedTaskProducer(Queue<Runnable> queue, ExecutorService executorService) {
            this.queue = queue;
            this.executorService = executorService;
        }
    
        @Override
        public void run() {
            for (int i = 0; i < 20; i++) {
                queue.add(new PrioritizedTask(random.nextInt(10)));
                Thread.yield();
            }
            for (int i = 0; i < 10; i++) {
                try {
                    TimeUnit.MILLISECONDS.sleep(250);
                    queue.add(new PrioritizedTask(20));
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
            for (int i = 0; i < 10; i++) {
                queue.add(new PrioritizedTask(i));
            }
            System.out.println("Finished PrioritizedTaskProducer");
        }
    }
    
    //消费者,取出优先队列的类
    class PrioritizedTaskConsumer implements Runnable {
        private PriorityBlockingQueue<Runnable> queue;
    
        public PrioritizedTaskConsumer(PriorityBlockingQueue<Runnable> queue) {
            this.queue = queue;
            System.out.println("队列中的元素个数" + queue.size());
        }
    
        @Override
        public void run() {
            while (!Thread.interrupted()) {
                try {
                    queue.take().run();//拿出优先级队列中的任务,并运行
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
            System.out.println("Finished PrioritizedTaskConsumer");
        }
    }
  • 相关阅读:
    Atitit 集团与个人的完整入口列表 attilax的完整入口 1. 集团与个人的完整入口列表 1 2. 流量入口概念 2 3. 流量入口的历史与发展 2 1.集团与个人的完整入口列表
    atitit 每季度日程表 每季度流程 v3 qaf.docx Ver history V2 add diary cyar data 3 cate V3 fix detail 3cate ,
    Atitit react 详细使用总结 绑定列表显示 attilax总结 1. 前言 1 1.1. 资料数量在百度内的数量对比 1 1.2. 版本16 v15.6.1 1 1.3. 引入js 2
    Atitit r2017 r3 doc list on home ntpc.docx
    Atitit r2017 ra doc list on home ntpc.docx
    Atiitt attilax掌握的前后技术放在简历里面.docx
    Atitit q2016 qa doc list on home ntpc.docx
    Atitit r7 doc list on home ntpc.docx 驱动器 D 中的卷是 p2soft 卷的序列号是 9AD0D3C8 D:\ati\r2017 v3 r01\
    Atitit 可移植性之道attilax著
    Atitit q2016 q5 doc list on home ntpc.docx
  • 原文地址:https://www.cnblogs.com/houj/p/11696938.html
Copyright © 2011-2022 走看看