ScheduledThreadPoolExecutor 定时重复执行任务

import java.util.concurrent.*;

import java.util.*;

public class TestGreenhouseScheduler {

    private volatile boolean light = false;

    private volatile boolean water = false;

    private String thermostat = "Day";

    public synchronized String getThermostat() {

        return thermostat;

    }

    public synchronized void setThermostat(String value) {

        thermostat = value;

    }

     //运行一次任务

    ScheduledThreadPoolExecutor scheduler = new ScheduledThreadPoolExecutor(10);

    public void schedule(Runnable event, long delay) {

        scheduler.schedule(event, delay, TimeUnit.MILLISECONDS);

    }

    public void repeat(Runnable event, long initialDelay, long period) {

        //scheduleAtFixedRate 定时执行一次任务,是重复执行

        scheduler.scheduleAtFixedRate(event, initialDelay, period,

                TimeUnit.MILLISECONDS);

    }

    class LightOn implements Runnable {

        int j=0;

        public void run() {

            // Put hardware control code here to

            // physically turn on the light.

            

            System.out.println("Turning on lights"+"执行了"+(j++));

            light = true;

        }

    }

    class LightOff implements Runnable {

        public void run() {

            // Put hardware control code here to

            // physically turn off the light.

            System.out.println("Turning off lights");

            light = false;

        }

    }

    class WaterOn implements Runnable {

        public void run() {

            // Put hardware control code here.

            System.out.println("Turning greenhouse water on");

            water = true;

        }

    }

    class WaterOff implements Runnable {

        public void run() {

            // Put hardware control code here.

            System.out.println("Turning greenhouse water off");

            water = false;

        }

    }

    class ThermostatNight implements Runnable {

        int j=0;

        public void run() {

        

            // Put hardware control code here.

            System.out.println("Thermostat to night setting"+"执行了"+(j++));

            setThermostat("Night");

        }

    }

    class ThermostatDay implements Runnable {

        public void run() {

            // Put hardware control code here.

            System.out.println("Thermostat to day setting");

            setThermostat("Day");

        }

    }

    class Bell implements Runnable {

        int j= 0;

        public void run() {

            

            System.out.println("Bing!"+"执行了"+(j++));

        }

    }

    class Terminate implements Runnable {

        public void run() {

            System.out.println("Terminating");

            scheduler.shutdownNow(); //结束线程

            // Must start a separate task to do this job,

            // since the scheduler has been shut down:

            new Thread() {

                public void run() {

                         //最后一次执行

                        System.out.println("nowww");

                }

            }.start();

        }

    }

    

    

    

    

    public static void main(String[] args) {

        TestGreenhouseScheduler gh = new TestGreenhouseScheduler();

        gh.schedule(gh.new Terminate(), 1000*7); //7秒运行一次任务,这里只执行一次

        gh.repeat(gh.new Bell(), 0, 1000);//1秒执行一次任务,是重复执行

        gh.repeat(gh.new ThermostatNight(), 0, 2000);

        gh.repeat(gh.new LightOn(), 0, 3000);

        

        

    

        

    }

}

 

---结果7秒之后,结束所有的线程,你看Bing执行了7次---

Bing!执行了0

Thermostat to night setting执行了0

Turning on lights执行了0

Bing!执行了1

Thermostat to night setting执行了1

Bing!执行了2

Bing!执行了3

Turning on lights执行了1

Bing!执行了4

Thermostat to night setting执行了2

Bing!执行了5

Bing!执行了6

Thermostat to night setting执行了3

Turning on lights执行了2

Terminating

Bing!执行了7

nowww

时间: 2024-10-07 17:46:55

ScheduledThreadPoolExecutor 定时重复执行任务的相关文章

定时重复执行一个任务

使用到的方法: Timer.schedule() TimerTask() 第一个方法里面有三个参数,分别为:任务(task),延时(delay),周期(period) 延时和周期使用的单位是毫秒. 1 private Timer mTimer = new Timer(); 2 private void timerTask(){ 3 mTimer.schedule(new TimerTask() { 4 @Override 5 public void run() { 6 mHandler.send

运维程序】简单的命令控制器(支持定时命令执行、重复定时任务命令和进程管理,开发这个小程序主要是为了方便管理服务进程)【个人github项目】

一.前言: command-controller 一个运维程序,简单的命令控制器(支持定时命令执行和重复定时命令,开发这个程序主要是为了方便管理服务进程) 本来是要用python做的,但是之前做ffmpeg的时候已经写了一部分Java的命令控制功能了,有些代码就拿过来改改用了(其实是为了偷懒qaq) 二.实现功能 1.进程管理 只支持本程序启动的进程管理,本程序主要功能是定时执行某些脚本或者系统命令,当然命令行和脚本是很自由的,更多用法请自行探索 2.定时命令.任务 3.重复定时命令.任务 4.

js定时器整理(执行一次、重复执行)

在javascritp中,有两个关于定时器的专用函数,分别为: 1.倒计定时器:timename=setTimeout("function();",delaytime); 2.循环定时器:timename=setInterval("function();",delaytime); 第一个参数"function()"是定时器触发时要执行的动作,可以是一个函数,也可以是几个函数,函数间用":"隔开即可. 比如要弹出两个警告窗口,便

使用定时器实现JavaScript的延期执行或重复执行

使用定时器实现JavaScript的延期执行或重复执行 window 对象提供了两个方法来实现定时器的效果,分别是window.setTimeout()和 window.setInterval.其中前者可以使一段代码在指定时间后运行:而后者则可以使一段代码 每过指定时间就运行一次.它们的原型如下: window.setTimeout(expression,milliseconds); window.setInterval(expression,milliseconds); 其中,expressi

C#多线程 定时重复调用异步线程即System.Threading.Timer类使用小例

1.System.Threading.Timer计时器提供了一种重复调用异步线程的方法..Net BCL中有多个Timer类,如用于Windows应用程序的System.Windows.Forms.Timer类,如可以运行在用户接口线程或工作线程上的System.Timers.Timer类.它们是很不一样的,这里要讲的System.Threading.Timer类是一种定时调用某个异步线程的类.每次计时器到设定的时间,系统就去线程池中开启一个线程运行提供的回调方法. 2.调用这个Timer类的重

remove name="ProxyModule“会导致重复执行

<?xml version="1.0" encoding="utf-8"?> <!-- 有关如何配置 ASP.NET 应用程序的详细信息,请访问 http://go.microsoft.com/fwlink/?LinkId=169433 --> <configuration> <appSettings> <add key="DomainProxy1" value="http://e3

Spring 定时任务重复执行的问题分析

背景:使用quartz时客户现场不知道为什么跑着跑着就停了,后来决定换成spring定时任务. 当使用spring定时任务时莫名奇妙的就是同一时间重复执行多次任务(通常情况下执行两次,有时候会达到3次).下面记录过程并逐一分析说明,供以后参考: 1.分析原因后发现是由ClassPathXmlApplicationContext导致 通过n多次试验发现: 当任务方法中不含任何业务逻辑时(如:只打印一些标志性的信息),任务能够正常执行,没有重复执行的现象: 当任务方法中包含业务逻辑,或应用程序执行别

jquery click点击事件重复执行多次

$("button[name^='privateBtn']").click(function(){ alert('demo'); //接触绑定.避免重复执行 $("button[name!='privateBtn']").unbind('click'); });

Shell脚本的循环:重复执行命令

1.for循环 语法: for  变量名称  in  变量值列表 do 命令 Done For根据变量值列表中的内容,重复执行命令,直到变量值列中的所有内容都取值完后结束. 取值列表的类型:可以是特定文本文件,命令生成列表 案例: vi  user.txt Zsan Lisi :wq vi  useradd_for.sh #!/bin/bash Un=$(cat /root/bin/user.txt) for  i  in  $Un do useradd $i echo  123123 |pas