ScheduledExecutorService 接口[通俗易懂]

ScheduledExecutorService 接口[通俗易懂]newScheduledThreadPool()或者newSingleThreadScheduled-Executor()方法:延迟执行、周期性执行的执行器如果想在某一段时间之后执行线程操作,或者周期性地重复执行线程操作,则可以使用工厂类Executors的newScheduledThreadPool()方法或者newSingleThreadSche…

大家好,又见面了,我是你们的朋友全栈君。

newScheduledThreadPool() 或者newSingleThreadScheduled-Executor()方法:延迟执行、周期性执行的执行器
        
            如果想在某一段时间之后执行线程操作,或者周期性地重复执行线程操作,则可以使用工厂类Executors的newScheduledThreadPool()方法或者 newSingleThreadScheduled-Executor()方法。
            newScheduledThreadPool()方法使用给定数目的线程来调度执行任务,而newSingleThreadScheduledExecutor()方法在一个单独的线程中调度任务。
            这两个方法都将返回一个ScheduledExecutorService线程池对象。
        
        ScheduledExecutorService接口
        
        ScheduledExecutorService接口从ExecutorService接口继承而来,可用于在给定的延迟后运行的某个任务,或者周期性的执行某个任务。
            schedule()方法用于创建并执行给定的延迟的任务,返回的ScheduledFuture对象可以取消执行,或检查执行状态。scheduleAtFixedRate 和scheduleWithFixedDelay用于创建并执行一个周期性或者
            固定延迟任务,直到任务取消。
            在schedule()方法中,延迟时间一般大于0,但也允许取值为0或者负数(非周期性执行),在这种情况下,认为是立刻执行。
            TimeUnit 用于指明时间单位,时间都是相对的时间,而不是绝对的时间。例如,在某一个日期之后运行,则可以使用下面的语句。
            scheduled(commad,date.getTime() -System.currentTimeMills,TimeUnit.MILLISECONDS)
            
        ScheduledFuture接口
            ScheduledExecutorService接口的4个方法都将返回ScheduledFuture对象,ScheduledFuture也是一个接口,他从Delay和Future接口继承而来,表示一个延迟的、结果可接受的操作。
            该接口的getDelay方法用于获得延迟时间,get()方法用于获得操作结果,cancel()方法用于取消一个任务。

            demo  示例:
            
            监控一个设备的工作温度,当温度超过10°C后,每隔1s发出一次警告,如果连续发出10报警后,仍没有处理,则停止设备运行。

            分析 :设置两个线程,一个线程表示设备运行。一个线程监视设备运行,采用ScheduleAtFixedRate()方法来调度,当设备警告10次,采用取消cancel()或者shutdown()方法关闭设备。
            
            //设备线程类
            public class Machine implements Runnable{

                int temperature;
                Machine(int temperature){

                    this.temperature = temperature;
                }
                public void run(){

                    perform();
                    temperature++;
                    System.out.println(“机器的工作温度在升高,当前的温度:”+temperature);
                }
                private void perform(){

                    int temp = (int)(Math.random()*Integer.MAX_VALUE);
                    int sum = 0;
                    for(int i=0;i<temp;i++){

                        sum += i;
                    }
                }
                private int getTemperature(){

                    return temperature;
                }
            }
            
            //监控设备线程类
            public class Monitor implements Runnable{

                Machine machine;
                ScheduledExecutorService scheduler;
                 static int n = 0;
                
                Monitor(Machine machine,ScheduledExecutorService scheduler){

                    this.machine = machine;
                    this.scheduler = scheduler;
                }
                public void run(){

                    if(machine.temperature>=10){

                        System.out.println(“警告!机器温度过高。”);
                        n++;
                    }
                    if(n>10){

                        System.out.println(“提醒次数限制已到,禁止任务”);
                        scheduler.shutdown();
                    }    
                }    
            }
            
            //测试启动类
            public class Index{

                public static void main(String[] args){

                    ScheduledExecutorService scheduler = Executors.newScheduledThreadPool(2);
                    Machine machine = new Machine(0);
                    Monitor monitor = new Monitor(machine,scheduler);
                    scheduler.scheduleAtFixedRate(machine,1,2,TimeUnit.SECONDS);
                    scheduler.scheduleAtFixedRate(monitor,0,1,TimeUnit.SECONDS);
                }
            }

运行结果:

机器的工作温度在升高,当前的温度:1
机器的工作温度在升高,当前的温度:2
机器的工作温度在升高,当前的温度:3
机器的工作温度在升高,当前的温度:4
机器的工作温度在升高,当前的温度:5
机器的工作温度在升高,当前的温度:6
机器的工作温度在升高,当前的温度:7
机器的工作温度在升高,当前的温度:8
机器的工作温度在升高,当前的温度:9
机器的工作温度在升高,当前的温度:10
警告!机器温度过高。
警告!机器温度过高。
机器的工作温度在升高,当前的温度:11
警告!机器温度过高。
警告!机器温度过高。
机器的工作温度在升高,当前的温度:12
警告!机器温度过高。
警告!机器温度过高。
机器的工作温度在升高,当前的温度:13
警告!机器温度过高。
警告!机器温度过高。
机器的工作温度在升高,当前的温度:14
警告!机器温度过高。
警告!机器温度过高。
机器的工作温度在升高,当前的温度:15
警告!机器温度过高。
提醒次数限制已到,禁止任务

 

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/137075.html原文链接:https://javaforall.net

(0)
上一篇 2022年5月5日 上午9:40
下一篇 2022年5月5日 上午10:00


相关推荐

  • 一篇关于数据库的操作

    0x00了解数据库数据库是“按照数据结构来组织、存储和管理数据的仓库”。是一个长期存储在计算机内的、有组织的、可共享的、统一管理的大量数据的集合。数据库是以一定方式储存在一起、能与多个用户共享、

    2021年12月11日
    43
  • 单细胞调控网路分析

    单细胞调控网路分析简介组织内细胞异质性的基础是细胞转录状态的差异 转录状态的特异性又是由转录因子主导的基因调控网络 GRNs 决定并维持稳定的 因此分析单细胞的 GRNs 有助于深入挖掘细胞异质性背后的生物学意义 并为疾病的诊断 治疗以及发育分化的研究提供有价值的线索 然而单细胞转录组数据具有背景噪音高 基因检出率低和表达矩阵稀疏性的特点 给传统统计学和生物信息学方法推断高质量的 GRNs 带来了挑战 随着生物信息学的发展 研发了不少软件用于单细胞调控网络的分析 如软件 SCENIC Single cellregulato

    2026年3月19日
    2
  • 数据库 schema含义_数据库表的概念

    数据库 schema含义_数据库表的概念数据库中的Schema突然想到数据库中的schema是什么,于是多方搜索有了基本了解,做一个简单记录:在SQL环境下,schema就是数据库对象的集合,所谓的数据库对象也就是常说的表,索引,视图,存储过程等。在schema之上的,就是数据库的实例,也就是通常createdatabases获得的东西。也就是说一个schema可以有多个schema,可以给不同的用户创建不同的schema,并且他们…

    2025年8月14日
    3
  • python 字符串转列表,列表转字符串

    python 字符串转列表,列表转字符串1.字符串转列表python的split()函数个人认为是个相当神奇的存在。比如你有一串字符串需要解析。就可以用split()想去掉字符串里面的回车键:str=a.split(‘\n’)想去掉前两个a字符str=a.split(‘a’,2)就是这么神奇。返回的str还是个列表。2.列表转字符串若想将python的列表转化为字符串,直接去掉‘[…

    2022年5月20日
    36
  • 建模方法(四)-因子分析定义和应用

    建模方法(四)-因子分析定义和应用因子分析 factoranalys 也是一种降维 简化数据的技术 它通过研究众多变量之间的内部依赖关系 使用少数几个 抽象 的变量来表示其基本的数据结构 这几个抽象的变量被称作 因子 能反映原来众多变量的主要信息 原始的变量是可观测的显在变量 而因子一般是不可观测的潜在变量 例如 商店的环境 商店的服务和商品的价格作为因子 这三个方面除了价格外 商店的环境和服务质量 都是客观

    2026年3月19日
    2
  • 小米手机解BL锁 刷开发版系统获取root权限「建议收藏」

    小米手机解BL锁 刷开发版系统获取root权限「建议收藏」小米手机想要获得root权限的话就要刷开发版的系统,这个是不叫简单省事的,获得root权限第一步,打开小米的这个网站http://www.miui.com/unlock/download.html按照上面的操作,解除BL锁。第二步从官网下载的解锁工具后打开如下图所示,手机进入兔子界面后,要先安装驱动,然后运行解锁程序第三步链接好手机和登录账号后直接点击解锁,解锁成功后如下图所示第四步前往http://www.miui.com/download.html小米官

    2022年5月15日
    84

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号