并发队列: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

总结


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

[] ) [](top

原文创作:叫练

原文链接:https://www.cnblogs.com/jiaolian/p/14376624.html

文章列表

更多推荐

更多
  • IOS开发者的AWS和DevOps指南-十、iOS 应用开发的持续交付渠道 Jenkins 管道公司,AWS 代码管道,摘要,Fastlane 测试阶段,AWS 设备场测试阶段,Fastlane 构建阶段,Fastlane 交付阶段,为 AWS 代码管道设置 Jenkins 环境,在 AWS 控制台上设置代码管
    Apache CN

  • IOS开发者的AWS和DevOps指南-九、将 AWS 设备群用于测试 AWS 设备群简介,为应用测试生成 ipa 包,设置设备场项目并安排测试运行,AWS 设备场 Jenkins 插件,使用 Jenkins 自动化 AWS 设备群测试,摘要,使用 AWS 控制台安排测试运行,使用 AWS CLI 计划测试
    Apache CN

  • IOS开发者的AWS和DevOps指南-八、使用 Fastlane 自动构建、测试和发布 使用 Fastlane 匹配和亚马逊 S3 设置代码签名,设置 Jenkins 环境,用 Fastlane 自动化测试和构建,自动发布到 App Store Connect,摘要,正在初始化 Fastlane 匹配,在亚马逊 S3 存储
    Apache CN

  • IOS开发者的AWS和DevOps指南-六、使用 AWS CodeCommit 的源代码管理 Git 基础,创建 AWS 代码提交存储库,在 AWS 代码提交中添加源代码,AWS 代码提交中分支,AWS 代码提交中的拉请求,摘要,Git 安装,初始化 Git 存储库,记录对 Git 存储库的更改,克隆和使用远程 Git 存储库,
    Apache CN

  • IOS开发者的AWS和DevOps指南-七、将 AWS CodeCommit 与 Jenkins 集成 Jenkins 代码提交插件,设置集成组件,配置插件,使用 AWS 代码提交源创建 Jenkins 作业,摘要,通过 AWS 控制台设置组件,通过 Terraform 设置组件,测试 AWS 代码提交插件, 当应用源代码存储在 AWS
    Apache CN

  • IOS开发者的AWS和DevOps指南-四、AWS 上的 macOS 服务器 Amazon EC2 Mac 服务器,部署 Amazon EC2 Mac 服务器,连接到 Amazon EC2 Mac 服务器,使用 Amazon CloudWatch 监控 EC2 Mac 服务器,清理 Amazon EC2 Mac
    Apache CN

  • IOS开发者的AWS和DevOps指南-五、在 macOS 实例上设置开发工具 增加 macOS 实例宗卷大小,设置 Xcode,陷害 Jenkins,建立 Fastlane,设置 GitLab,摘要,Xcode 命令行工具,供应 Jenkins 控制器,EC2 Mac 实例作为 Jenkins 构建代理,创建 G
    Apache CN

  • IOS开发者的AWS和DevOps指南-三、亚马逊网络服务(AWS)上的 DevOps 三、亚马逊网络服务AWS上的 DevOpsAWS 上的持续集成,AWS 上的连续交付,基础设施作为代码,监控和记录,摘要,AWS 代码提交,AWS 代码构建,AWS 程式码人工因素,AWS 代码部署,AWS 代码管道,AWS 云阵,AW
    Apache CN

  • IOS开发者的AWS和DevOps指南-二、从 Xcode 到 App Store Connect 标识符,应用商店连接,从 Xcode 上传构件,测试和发布,摘要,截图和应用详细信息,TestFlight 软件,应用提交, 在前一章中,我们看到了如何使用 Xcode 在物理 iPhone 设备和模拟器上构建和运行应用。我们将进一步探
    Apache CN

  • IOS开发者的AWS和DevOps指南-一、iOS 应用开发基础 开发要求,迅速发生的,摘要,苹果个人计算机,苹果开发者账户,Xcode 简介,创建应用,构建应用,Xcode 命令行工具, 为了开发 iOS 应用,苹果提供了几种工具和资源。iOS 应用可以用原生编程语言开发,如 Swift 或 Obj
    Apache CN

  • 近期文章

    更多
    文章目录

      推荐作者

      更多