ScheduleExecutorService定时任务的使用

Android中开启定时任务有几种方案:Timer、Handler、ScheduleExecutorService等。但ScheduleExecutorService应该是最推荐使用的,因为ScheduledExecutorService是将定时任务与线程池功能结合在了一起,任务是并发执行,互不影响。Timer的内部只有一个线程,如果有多个任务的话是顺序执行。那ScheduleExecutorService具体怎么用?

ScheduleExecutorService有3个方法执行定时任务:

schedule(runnable, delay, unit)

scheduleAtFixedRate(runnable, initialDelay, period, unit);

scheduleWithFixedDelay(runnable, initialDelay, delay, unit);

其中schedule(runnable, delay, unit)是指单次延时任务; scheduleAtFixedRate 和 scheduleWithFixedDelay 都是开启循环任务的方法,但两者时间在执行时间上有区别:scheduleAtFixedRate()按照上一次任务的发起时间作为开始时间计算下一次任务的开始时间,而scheduleWithFixedDelay()是以上一次任务的结束时间作为开始时间计算下一次任务的开始时间。

使用方法示例:

schedule:(5秒后执行线程)

ScheduledExecutorService mService = Executors.newScheduledThreadPool(5);

mService.schedule(new Runnable() {

@Override

public void run() {

        System.out.println("-------单次任务执行--------");

}

}, 5, TimeUnit.SECONDS);

scheduleAtFixedRate:(1秒后执行线程,以后每隔5秒执行一次线程)(线程开始时间开始计时)

mService.scheduleAtFixedRate(new Runnable() {

@Override

public void run() {

try {

        System.out.println("-------定期任务执行--------");

        Thread.sleep(1000);

} catch (InterruptedException e) {

        // TODO Auto-generated catch block

        e.printStackTrace();

}

}

}, 1, 5, TimeUnit.SECONDS);

scheduleWithFixedDelay:(1秒后执行线程,以后每隔6秒执行一次线程)(线程结束时间开始计时)

mService.scheduleWithFixedDelay(new Runnable() {

@Override

public void run() {

try {

        System.out.println("-------定期任务执行--------");

        Thread.sleep(1000);

} catch (InterruptedException e) {

        // TODO Auto-generated catch block

        e.printStackTrace();

}

}

}, 1, 5, TimeUnit.SECONDS);

关闭任务:

if (mService !=null && !mService.isShutdown()) {

        mService.shutdown();

}

总结:

scheduleWithFixedDelay(runnable, initialDelay, delay, unit)第一次执行时间是initialDelay时间后,以后每次执行间隔是runnable任务执行完的时间加上delay的时间;scheduleAtFixedRate(runnable, initialDelay, period, unit)第一次执行时间是initialDelay时间后,以后每次执行间隔就是delay的时间,但这里有一种特殊情况,当period间隔的时间比runnable执行时间还要短的时候,period时间到了并不会立即执行,而是等runnable结束之后才立即执行下一次任务;

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 网络上关于java定时器的文章真的是错误百出,给我的学习造成了很大的困扰,Timer根本就没有线程安全问题,Tim...
    江江的大猪阅读 1,809评论 0 30
  •   一个任务通常就是一个程序,每个运行中的程序就是一个进程。当一个程序运行时,内部可能包含了多个顺序执行流,每个顺...
    OmaiMoon阅读 1,738评论 0 12
  • “成长率”这个词之所以说难以理解,是无法彻底明白,是因为它跟“增长率”不同,笑来老师用收入的增长数字把后者介绍的很...
    随意咖啡阅读 196评论 0 0
  • 不要在意别人在背后怎么看你说你,因为这些言语改变不了事实,却可能搅乱你的心。 心如果乱了,一切就都乱了。理解你的人...
    巧克茶阅读 260评论 0 0
  • 父亲去世10年后,在我的“软硬兼施”下,母亲终于同意来郑州跟着我——她最小的女儿一起生活。这一年,母亲70岁,我4...
    小猫猫阅读 299评论 5 0