zoukankan      html  css  js  c++  java
  • 并发队列:PriorityBlockingQueue和DelayQueue案例使用

     

    PriorityBlockingQueue使用


    import java.util.concurrent.PriorityBlockingQueue;
    
    /**
     * @author :jiaolian
     * @date :Created in 2021-02-03 15:44
     * @description:priorityBlockingQueue优先级队列测试
     * @modified By:
     * 公众号:叫练
     */
    public class PriorityBlockingQueueTest {
    
        public static void main(String[] args) {
            m2();
        }
    
        public static void m2() {
            PriorityBlockingQueue<Student> priorityBlockingQueue = new PriorityBlockingQueue<>();
            priorityBlockingQueue.add(new Student("叫练1",22));
            priorityBlockingQueue.add(new Student("叫练2",21));
            priorityBlockingQueue.add(new Student("叫练3",23));
            while (!priorityBlockingQueue.isEmpty()) {
                Student student = null;
                try {
                    student = priorityBlockingQueue.take();
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
                System.out.println(student);
            }
        }
    
        private static class Student implements Comparable<Student> {
            private String name;
            private int age;
    
            public Student(String name, int age) {
                this.name = name;
                this.age = age;
            }
    
            public String getName() {
                return name;
            }
    
            public int getAge() {
                return age;
            }
    
            @Override
            public String toString() {
                return "Student{" +
                        "name='" + name + '\'' +
                        ", age=" + age +
                        '}';
            }
    
            @Override
            public int compareTo(Student o) {
                //从大到小排队
                return this.age - o.getAge();
            }
        }
    }

    如上代码:PriorityBlockingQueue优先级队列PriorityBlockingQueue队列的元素需要实现Comparable接口,完成队列的排序,上述代码中定义了Student类实现Comparable接口,Student的compareTo接口按照age属性从小到大排队,输出结果如下图所示。PriorityBlockingQueue底层是二叉平衡树的数组结构实现出队和入队。

    image.png

     

    DelayQueue使用


    import java.util.concurrent.DelayQueue;
    import java.util.concurrent.Delayed;
    import java.util.concurrent.TimeUnit;
    
    /**
     * @author :jiaolian
     * @date :Created in 2021-02-03 16:28
     * @description:延迟队列测试
     * @modified By:
     * 公众号:叫练
     */
    public class DelayQueueTest {
    
        public static void main(String[] args) throws InterruptedException {
            DelayQueue<Student> delayQueue = new DelayQueue<Student>();
            delayQueue.add(new Student("叫练1",5));
            delayQueue.add(new Student("叫练2",3));
            delayQueue.add(new Student("叫练3",6));
            while (!delayQueue.isEmpty()) {
                System.out.println(delayQueue.take());
            }
        }
    
    
        private static class Student implements Delayed {
            private String name;
            //触发时间/秒
            private long time;
    
            public String getName() {
                return name;
            }
    
    
            public long getTime() {
                return time;
            }
    
            public Student(String name,  long time) {
                this.name = name;
                this.time = time*1000+System.currentTimeMillis();
            }
    
            @Override
            public long getDelay(TimeUnit unit) {
                //延迟时间小于0就出队列
                long aa = time - System.currentTimeMillis();
                return aa;
            }
    
            @Override
            public int compareTo(Delayed o) {
                //时间排序,从小到大排列
                Student student = (Student) o;
                return (int)(this.time - student.getTime());
            }
    
            @Override
            public String toString() {
                return "Student{" +
                        "name='" + name + '\'' +
                        ", time=" + time +
                        '}';
            }
        }
    }

    如上代码:DelayQueue是延时队列,只有到指定时间的队列才可以出队列,底层使用优先级队列,上面代码定义Student类需要实现Delayed接口同时需要实现getDelay方法和compareTo方法,getDelay方法用于计算出队列时间,一旦小于0就会出队列;compareTo方法用于按触发时间从小到大排序。执行程序后,学生“叫练2”3秒后出队列;学生“叫练1”5秒后出队列;学生“叫练3”6秒后出队列。执行结果如下图所示。

    image.png

     

    总结


    今天我们的内容比较简单。喜欢的请点赞和评论哦!点关注,不迷路,我是叫练【公众号】,边叫边练。期待我们下次再见!

  • 相关阅读:
    bzoj 1800 & 洛谷 P2165 [AHOI2009]飞行棋 —— 模拟
    bzoj 1050 [ HAOI 2006 ] 旅行comf —— 并查集
    洛谷P2593 [ ZJOI 2006 ] 超级麻将 —— DP
    bzoj 3029 守卫者的挑战 —— 概率DP
    poj 2288 Islands and Bridges ——状压DP
    bzoj 1029 [ JSOI 2007 ] 建筑抢修 —— 贪心
    bzoj 3743 [ Coci 2015 ] Kamp —— 树形DP
    bzoj 1053 [ HAOI 2007 ] 反素数ant ——暴搜
    【构造共轭函数+矩阵快速幂】HDU 4565 So Easy! (2013 长沙赛区邀请赛)
    构造类斐波那契数列矩阵(矩阵
  • 原文地址:https://www.cnblogs.com/jiaolian/p/14376624.html
Copyright © 2011-2022 走看看