ScheduledExecutorService的使用及守护线程

news2024/11/17 13:29:18

只运行一次

https://img-blog.csdnimg.cn/20201028113139387.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dhbmd4dWVsZWkwMzY=,size_16,color_FFFFFF,t_70

private static ScheduledExecutorService scheduler;

    public static void main(String[] args) throws Exception {

        scheduler = Executors.newScheduledThreadPool(5);

        // 循环任务,按照上一次任务的发起时间计算下一次任务的开始时间

        scheduler.scheduleAtFixedRate(((

                        new Runnable() {

                            @Override

                            public void run() {

                                System.out.println(

                                        " 开始 threadId = "

                                                + Thread.currentThread().getId()

                                                + ",,,threadName = " + Thread.currentThread().getName()

                                                + ",,,时间" +  formatDateToString(new Date())

                                );

                                try {

                                    Thread.sleep(3000);

                                    System.out.println(

                                            " 结束 threadId = "

                                                    + Thread.currentThread().getId()

                                                    + ",,,threadName = " + Thread.currentThread().getName()

                                                    + ",,,时间" + formatDateToString(new Date())

                                    );

                                } catch (InterruptedException e) {

                                    e.printStackTrace();

                                }

                                //模拟抛出异常

                                if (1 == 1) {

                                    throw new RuntimeException("异常");

                                }

                            }

                        })),

                0, 1,

                TimeUnit.SECONDS);

        Thread.sleep(20000);

        System.out.println(

                " 主线程 threadId = "

                        + Thread.currentThread().getId()

                        + ",,,threadName = " + Thread.currentThread().getName()

                        + ",,,时间" + formatDateToString(new Date())

        );

    }

    public static String formatDateToString(Date time) {

        SimpleDateFormat sdf = new SimpleDateFormat("HH:mm:ss");

        return sdf.format(time);

}

https://img-blog.csdnimg.cn/20201028111403823.png

private static ScheduledExecutorService scheduler;

    public static void main(String[] args) throws Exception {

        scheduler = Executors.newScheduledThreadPool(5);

        // 循环任务,按照上一次任务的发起时间计算下一次任务的开始时间

        scheduler.scheduleAtFixedRate(((

                        new Runnable() {

                            @Override

                            public void run() {

                                System.out.println(

                                        " 开始 threadId = "

                                                + Thread.currentThread().getId()

                                                + ",,,threadName = " + Thread.currentThread().getName()

                                                + ",,,时间" +  formatDateToString(new Date())

                                );

                                try {

                                    Thread.sleep(3000);

                                    System.out.println(

                                            " 结束 threadId = "

                                                    + Thread.currentThread().getId()

                                                    + ",,,threadName = " + Thread.currentThread().getName()

                                                    + ",,,时间" + formatDateToString(new Date())

                                    );

                                } catch (InterruptedException e) {

                                    e.printStackTrace();

                                }

                            }

                        })),

                0, 1,

                TimeUnit.SECONDS);

    }

    public static String formatDateToString(Date time) {

        SimpleDateFormat sdf = new SimpleDateFormat("HH:mm:ss");

        return sdf.format(time);

}

可以看到其实间隔时间已经变成了 任务执行时间来控制,但是一般来说,很少有任务执行时间超过间隔时间,但是这个知识点还是要知道。 

https://img-blog.csdnimg.cn/20201028111720513.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dhbmd4dWVsZWkwMzY=,size_16,color_FFFFFF,t_70

scheduleAtFixedRate 正常使用 延迟时间1S,执行任务时间 1S,间隔时间3S

private static ScheduledExecutorService scheduler;

    public static void main(String[] args) throws Exception {

        scheduler = Executors.newScheduledThreadPool(5);

        // 循环任务,按照上一次任务的发起时间计算下一次任务的开始时间

        scheduler.scheduleAtFixedRate(((

                        new Runnable() {

                            @Override

                            public void run() {

                                System.out.println(

                                        " 开始 threadId = "

                                                + Thread.currentThread().getId()

                                                + ",,,threadName = " + Thread.currentThread().getName()

                                                + ",,,时间" +  formatDateToString(new Date())

                                );

                                try {

                                    Thread.sleep(1000);

                                    System.out.println(

                                            " 结束 threadId = "

                                                    + Thread.currentThread().getId()

                                                    + ",,,threadName = " + Thread.currentThread().getName()

                                                    + ",,,时间" + formatDateToString(new Date())

                                    );

                                } catch (InterruptedException e) {

                                    e.printStackTrace();

                                }

                            }

                        })),

                0, 3,

                TimeUnit.SECONDS);

    }

    public static String formatDateToString(Date time) {

        SimpleDateFormat sdf = new SimpleDateFormat("HH:mm:ss");

        return sdf.format(time);

}

scheduleWithFixedDelay 正常使用

private static ScheduledExecutorService scheduler;

    public static void main(String[] args) throws Exception {

        scheduler = Executors.newScheduledThreadPool(5);

        // 循环任务,按照上一次任务的发起时间计算下一次任务的开始时间

        scheduler.scheduleWithFixedDelay(((

                        new Runnable() {

                            @Override

                            public void run() {

                                System.out.println(

                                        " 开始 threadId = "

                                                + Thread.currentThread().getId()

                                                + ",,,threadName = " + Thread.currentThread().getName()

                                                + ",,,时间" +  formatDateToString(new Date())

                                );

                                try {

                                    Thread.sleep(3000);

                                    System.out.println(

                                            " 结束 threadId = "

                                                    + Thread.currentThread().getId()

                                                    + ",,,threadName = " + Thread.currentThread().getName()

                                                    + ",,,时间" + formatDateToString(new Date())

                                    );

                                } catch (InterruptedException e) {

                                    e.printStackTrace();

                                }

                            }

                        })),

                0, 1,

                TimeUnit.SECONDS);

    }

    public static String formatDateToString(Date time) {

        SimpleDateFormat sdf = new SimpleDateFormat("HH:mm:ss");

        return sdf.format(time);

}

scheduleWithFixedDelay以上一次任务的结束时间 + 延迟时间 = 下一次任务的开始时间。

https://img-blog.csdnimg.cn/20201028112216360.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dhbmd4dWVsZWkwMzY=,size_16,color_FFFFFF,t_70

以上就是两个循环任务的使用

private static ScheduledExecutorService scheduler;

    public static void main(String[] args) throws Exception {

        scheduler = Executors.newScheduledThreadPool(5, new ThreadFactory() {

            private AtomicInteger counter = new AtomicInteger(0);

            //可以在这里对线程做一些操作

            @Override

            public Thread newThread(Runnable r) {

                int count = counter.incrementAndGet();

                System.out.println("线程创建counter = " + count);

                Thread thread = new Thread(r);

                thread.setName("测试线程"+count);

                return thread;

            }

        });

        System.out.println("main thread time : " + formatDateToString(new Date()));

        // 循环任务,按照上一次任务的发起时间计算下一次任务的开始时间

        scheduler.scheduleAtFixedRate(((

                        new Runnable() {

                            @Override

                            public void run() {

                                System.out.println(

                                        " 开始 threadId = "

                                                + Thread.currentThread().getId()

                                                + ",,,threadName = " + Thread.currentThread().getName()

                                                + ",,,时间" +  formatDateToString(new Date())

                                );

                            }

                        })),

                1,5,

                TimeUnit.SECONDS);

    }

    public static String formatDateToString(Date time) {

        SimpleDateFormat sdf = new SimpleDateFormat("HH:mm:ss");

        return sdf.format(time);

}

其实就是提供了一个扩展点,允许你在创建线程的时候,做一些管理或者说一些其他的操作

https://img-blog.csdnimg.cn/20201028114539843.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dhbmd4dWVsZWkwMzY=,size_16,color_FFFFFF,t_70

也可以使用 ThreadFactoryBuilder 构建类 来构建FactoryBuilder

scheduler = Executors.newScheduledThreadPool(5,new ThreadFactoryBuilder()

                .setNameFormat("测试线程-%d")

//                .setDaemon(true) //这个参数是设置为守护线程 也叫 服务线程

                .build());

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/82853.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

解决mysql存储emoji表情唯一索引报错问题

问题发现: 1、正常上班的一天,突然间有运营同事反馈,我们在添加数据的时候,发现添加了🐸之后,对应的💩没有了,添加了💩然后🐸就没有了,需要研发帮…

【Linux】四、Linux 进程概念(四)|进程地址空间

目录 十、进程地址空间 10.1 回顾C/C 地址空间 10.2 测试 10.3 感性理解虚拟地址空间 10.4 如何画大饼? 10.5 如何理解区域划分和区域调整 10.6 虚拟地址空间、页表和物理地址 10.7 为什么存在地址空间 10.7.1 保证物理内存的安全性 10.7.2 保证进程的独立…

铁蛋白-海藻酸钠纳米包埋ACE抑制肽|海藻酸钠修饰碳纳米管(SAL-MWNTs)

铁蛋白-海藻酸钠纳米包埋ACE抑制肽|海藻酸钠修饰碳纳米管(SAL-MWNTs) 铁蛋白-海藻酸钠纳米包埋ACE抑制肽产品描述:利用铁蛋白在较酸条件下可逆组装特性和海藻酸钠(sodium alginate,SA)的控释作用,以马脾脱铁铁蛋白(horse spleen apoferritin,HSF)和SA作为纳米载体,…

Rust 基础(八)—— 高级特性

十九、高级特性 到目前为止,您已经学习了Rust编程语言最常用的部分。在我们开始第20章的下一个项目之前,我们先来看一下你可能偶尔会碰到,但不是每天都在使用的语言的一些方面。当你遇到任何未知的情况时,你可以使用这一章作为参…

[毕业设计]2022-2023年最新最全计算机专业毕设选题推荐汇总

目录 ①javaweb信息管理系统或web应用选题(应用开发类) ②微信小程序开发方向 ③游戏动画、数字媒体方向 ④深度学习、机器学习方向 ⑤算法研究方向 ⑥物联网、嵌入式方向 ⑦信息安全、网络安全 ⑧大数据分析、大数据预测 ⑨Matlab 选题迷茫 选题的重要性 选题指导 对毕…

Springboot利用Security做OAuth2资源服务器

Springboot利用Security做OAuth2授权验证_LO嘉嘉VE的博客-CSDN博客_springbootsecurity oauth2 密码认证 验证服务器在上一篇文章中. 验证服务器是做权限验证,有没有登录,有没有权限访问某些内容等。资源服务器指提供业务功能的服务器,他们…

使用idea创建springboot项目

一、第一种创建方法 点击File——>New——>Project 接下来选择空项目,如下图所示: 接下来点击Next——>项目名称——>finish 点击finish后会弹出如下图,让你新建一个Moudles 如下图, 在项目结构里面点击Modules——…

Kubeadm 部署 k8s 集群

目录 1.初始化设置 2.所有节点安装docker 3.k8s节点安装kubeadm,kubelet和kubectl 4.部署K8S集群 5.部署Dashboard 6.部署harbor私有仓库 名称设置组件master192.168.116.70(2C/4G,cpu核心数要求大于2)docker、kubeadm、ku…

南开大学程明明-学术规范及论文写作指导

第一讲 学术规范与论文写作-写作规范 主要内容 why writing is important 导致剽窃的原因(引用不当也会导致): 引用不是介绍别人的工作,而是更加清晰介绍自己的工作 第二讲 学术规范与论文写作-WrittingTips 各种工具的使用 Ove…

s5pv210 i2c 时序

1 低层时序 ①. 底层时序 ******** 低层时序: ①.空闲: scl clk都是高电平②.起始位: 一个时间段,这个段时间内,SCL高电平, SDA 出现下降沿 , 接收方收到以后,知道了,…

为什么在 2023 年只使用 console.log 是一个大禁忌

这里有 5 个必须知道的控制台对象方法和技巧! 在 2023 年,您是否仍在使用它console.log来满足所有 JavaScript 调试需求? 是时候提升您的技能并发现 JavaScript 控制台对象的全部功能了。 从console.table到console.time,这些高…

CFD-Post后处理,你真的会做吗?

导读:流体仿真中,解决问题通常分为四个步骤:几何—网格—求解—后处理。今天我们来学习最后一步:后处理。尤其对新手来说,首先要了解一下什么是后处理? 我们通过软件计算收敛后的得到的结果,只…

Python学习笔记-面向对象程序设计

记述python中关于面向对象程序设计的使用。 一、面向对象概述 面向对象(Object Oriented),简称OO; 面向对象编程(Object Oriented Programming),简称OOP。 1.对象 英文为Object&#xff0c…

IMX6ULL学习笔记(13)——GPIO接口使用【汇编方式】

一、GPIO简介 i.MX6ULL 芯片的 GPIO 被分成 5 组,并且每组 GPIO 的数量不尽相同,例如 GPIO1 拥有 32 个引脚, GPIO2 拥有 22 个引脚, 其他 GPIO 分组的数量以及每个 GPIO 的功能请参考 《i.MX 6UltraLite Applications Processor Reference M…

vTESTstudio入门到精通 - vTESTstudio工程创建_01

入行车载网络测试多年以来,最大的困扰就是网上几乎无法搜到工作中常见的问题答案,特别是vTESTstudio的工程和开发相关的问题,在晚上几乎就是一片未知的大陆,偶尔有几篇同行写的,基本也都是某个问题或者某个demo的创建基础讲解,至今我还未找到有博主将vTESTstudio从入门的…

艾美捷—如何选择合适的SAM甲基转移酶活性分析试剂盒?

SAM,也称为 AdoMet,充当修饰蛋白质和 DNA 所需的甲基的供体。SAM 的异常水平与许多异常有关,包括阿尔茨海默氏症、抑郁症、帕金森氏症、多发性硬化症、肝功能衰竭和癌症。 市面上,SAM甲基转移酶酶活性分析试剂盒非常少&#xff0c…

ccf历年第二题满分python代码及知识点总结(2013-2022)

201312-2ISBN号码 思路: 就是简单的字符串处理,没有什么好说的。 代码: str_input input() s str_input.replace("-", "") sum_value 0 start 1 for i in range(len(s)-1):sum_value int(s[i]) * startstart 1…

AI-多模态-2021:ALIGN【】

https://arxiv.org/abs/2102.05918 【写在前面】 学习良好的视觉和视觉语言表征对于解决计算机视觉问题(图像检索、图像分类、视频理解)是至关重要的,目前,预训练的特征在许多NLP任务中已经展现了非常大的潜力。虽然NLP中的表示学习已经可以用没有人工…

消息队列基础

消息队列的应用场景 异步处理,提升吞吐量 削峰填谷,平滑流量冲击 应用解耦,提升系统可用性 消息通讯,点对点消息通讯 消息模型 点对点模式 生产者生产消息到队列服务器,消费者消费消息,并发送确认收到…

Redis Cluster 扩容实战

Redis Cluster 扩容 接着上一篇Redis Cluster 单机集群部署,今天学习下Redis Cluster 架构在实际应用中如何面对各种复杂的场景,如: 扩容 - 增加节点缩减 - 删除节点宕机 - 主节点服务异常 增加节点 随着集群需求的变化,系统人…