zoukankan      html  css  js  c++  java
  • ScheduledExecutor定时器

    为了弥补Timer 的上述缺陷,在Java 5的时候推出了基于线程池设计的 ScheduledExecutor。其设计思想是:每一个被调度的任务都会由线程池中一个线程去执行,因此任务是并发执行的,相互之间不会受到干扰。但需要注意的是只有当任务的执行时间到来时,ScheduedExecutor 才会真正启动一个线程,其余时间 ScheduledExecutor 都是在轮询任务的状态。

    public class MainActivity extends AppCompatActivity {
        private TextView textView;
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main);
    //        textView = (TextView) findViewById(R.id.text);
            testScheduledExecutorWay();
        }
            private static void testScheduledExecutorWay(){
                ScheduledExecutorService service = Executors.newScheduledThreadPool(10);//创建线程池的方式有几种,可以根据业务具体选择
    
                long initialDelay1 = 1;
                long period1 = 1;
                // 从现在开始1秒钟之后,每隔1秒钟执行一次job1
                service.scheduleAtFixedRate(
                        new ScheduledExecutorTest("job1"), initialDelay1,
                        period1, TimeUnit.SECONDS);
    
                long initialDelay2 = 1;
                long delay2 = 1;
                // 从现在开始1秒钟之后,每隔1秒钟执行一次job2
                service.scheduleWithFixedDelay(
                        new ScheduledExecutorTest("job2"), initialDelay2,
                        delay2, TimeUnit.SECONDS);
            }
    
            static class ScheduledExecutorTest implements Runnable{
                private String jobName = "";
    
                public ScheduledExecutorTest(String jobName) {
                    super();
                    this.jobName = jobName;
                }
    
                @Override
                public void run() {
                    System.out.println(getNowTime()+"执行作业:" + jobName);
                }
            }
    
            public static String getNowTime(){
                Date now = new Date();
                SimpleDateFormat dateFormat = new SimpleDateFormat("HH:mm:ss");// 可以方便地修改日期格式
                return dateFormat.format(now);
            }
    
    }

    ScheduledExecutorService 中两种最常用的调度方法 ScheduleAtFixedRate 和 ScheduleWithFixedDelay。其中ScheduleAtFixedRate 每次执行时间为上一次任务开始起向后推一个时间间隔,即每次执行时间为 :initialDelay, initialDelay+period, initialDelay+2*period, …;而ScheduleWithFixedDelay 每次执行时间为上一次任务结束起向后推一个时间间隔,即每次执行时间为:initialDelay, initialDelay+executeTime+delay, initialDelay+2*executeTime+2*delay。所以两种方式异同在于ScheduleAtFixedRate 是基于固定时间间隔进行任务调度,ScheduleWithFixedDelay 取决于每次任务执行的时间长短,是基于不固定时间间隔进行任务调度。

  • 相关阅读:
    Java实现 蓝桥杯VIP 基础练习 完美的代价
    Java实现 蓝桥杯VIP基础练习 矩形面积交
    Java实现 蓝桥杯VIP 基础练习 完美的代价
    Java实现 蓝桥杯 蓝桥杯VIP 基础练习 数的读法
    Java实现 蓝桥杯 蓝桥杯VIP 基础练习 数的读法
    Java实现 蓝桥杯 蓝桥杯VIP 基础练习 数的读法
    Java实现 蓝桥杯 蓝桥杯VIP 基础练习 数的读法
    Java实现 蓝桥杯 蓝桥杯VIP 基础练习 数的读法
    核心思想:想清楚自己创业的目的(如果你没有自信提供一种更好的产品或服务,那就别做了,比如IM 电商 搜索)
    在Linux中如何利用backtrace信息解决问题
  • 原文地址:https://www.cnblogs.com/Ocean123123/p/10990889.html
Copyright © 2011-2022 走看看