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
警告!机器温度过高。
提醒次数限制已到,禁止任务

 

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

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

【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛

【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...

(0)


相关推荐

  • &0xFF是怎么个意思[通俗易懂]

    &0xFF是怎么个意思[通俗易懂]今天看了下同事从网上拷贝的base64加密的代码,看到了这样如下的代码publicstaticStringencode(byte[]data){StringBuildersb=newStringBuilder();intlen=data.length;inti=0;intb1,b2,b3;while(i

  • 八种排序算法的时间复杂度复杂度

    八种排序算法的时间复杂度复杂度https://www.cnblogs.com/dll-ft/p/5861210.html 转载1、稳定性归并排序、冒泡排序、插入排序。基数排序是稳定的选择排序、快速排序、希尔排序、堆排序是不稳定的 2、时间复杂度最基础的四个算法:冒泡、选择、插入、快排中,快排的时间复杂度最小O(n*log2n),其他都是O(n2)排序法 平均时间 最差情形 稳定度…

  • vue怎么和后端对接_vue搭配什么后端

    vue怎么和后端对接_vue搭配什么后端简单分享一下jeeplus框架部署liunx服务器跨域问题 ,因为我这个是前后端服务器分离所以配置了俩份java后端配置1.跨域后端配置nginx(图-1)上配置 server { listen 80; server_name xxx.xx.xxx; #后端服务域名 #charset koi8-r; #access_log logs/host.access.log main; locatio

  • 浅谈CICD持续集成、持续部署的流程

    浅谈CICD持续集成、持续部署的流程Jenkins是一个比较流行的持续集成工具GitLab是存储镜像的镜像仓库由客户端将代码push推送到git仓库,gitlab上配置了一个webHook的东西可以触发Jenkins的构建。进入到Jenkins虚线范围内,它所做的事情非常多,从mvn构建代码,对代码进行静态分析,做单元测试,测试通过之后就可以build镜像,镜像构建成功后就把镜像push推送到Harbor镜像仓库中,镜像push…

  • 视屏剪辑软件 & free video editor

    视屏剪辑软件 & free video editor视屏剪辑软件&freevideoeditorpurposeaddanimationkeyframetotutorialsvideovlogdemostutorial

  • 将十进制小数转化为二进制小数

    将十进制小数转化为二进制小数小数表示原理你了解小数的表示原理吗?我的十进制小数换成二进制该如何表示?比如:0.3的二进制表示为:0.0100110011001….(小数乘以2,取整,小数部分继续乘以2,取整,得到小数部分0为止,将整数顺序排列。0.8125×2=1.625取整1,小数部分是0.6250.625×2=1.25取整1,小数部分是0.250.25×2=0.5取整0,小

发表回复

您的电子邮箱地址不会被公开。

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