使用ScheduledThreadPoolExecutor进行Android的定时任务

一、ScheduledThreadPoolExecutor简介

1.1、构造方法

ScheduledThreadPoolExecutor有四个构造方法,如下所示:
ScheduledThreadPoolExecutor​(int corePoolSize)

ScheduledThreadPoolExecutor使用给定的核心池大小创建新的。

ScheduledThreadPoolExecutor​(int corePoolSize, RejectedExecutionHandler handler)

ScheduledThreadPoolExecutor使用给定的初始参数创建一个新的。

ScheduledThreadPoolExecutor​(int corePoolSize, ThreadFactory threadFactory)

ScheduledThreadPoolExecutor使用给定的初始参数创建一个新的。

ScheduledThreadPoolExecutor​(int corePoolSize, ThreadFactory threadFactory, RejectedExecutionHandler handler)

ScheduledThreadPoolExecutor使用给定的初始参数创建一个新的。

1.2、方法

decorateTask​(Runnable runnable,RunnableScheduledFuture<V> task)

  •  作用:修改或替换用于执行runnable的任务。

 decorateTask​(Callable<V> callable,RunnableScheduledFuture<V> task)

  • 作用:修改或替换用于执行可调用的任务。

execute​(Runnable command)

  • 作用:执行command所需的延迟为零。

getContinueExistingPeriodicTasksAfterShutdownPolicy()

  • 作用:获取有关是否继续执行现有定期任务的策略,即使此执行程序已执行shutdown

getExecuteExistingDelayedTasksAfterShutdownPolicy()

  • 作用:获取有关是否执行现有延迟任务的策略,即使此执行程序已执行shutdown

getQueue()

  • 作用:返回此执行程序使用的任务队列。

getRemoveOnCancelPolicy()

  • 作用:获取有关是否应在取消时立即从工作队列中删除已取消任务的策略。

schedule​(Runnable command, long delay, TimeUnit unit)

  • 作用:提交在给定延迟后启用的一次性任务。

schedule​(Callable<V> callable, long delay, TimeUnit unit)

  • 作用:提交一个返回值的一次性任务,该任务在给定的延迟后变为启用状态。

scheduleAtFixedRate​(Runnable command, long initialDelay, long period, TimeUnit unit)

  • 作用:提交在给定的初始延迟后首先启用的定期操作,随后在给定的时间段内启用; 也就是说,执行将在之后 initialDelay,然后initialDelay + period, initialDelay + 2 * period等等开始。

scheduleWithFixedDelay​(Runnable command, long initialDelay, long delay, TimeUnit unit)

  • 作用:提交在给定的初始延迟之后首先启用的定期动作,并且随后在一次执行的终止和下一次执行的开始之间给定延迟。

setContinueExistingPeriodicTasksAfterShutdownPolicy​(boolean value)

  • 作用:设置是否继续执行现有周期性任务的策略,即使此执行程序已执行shutdown

setExecuteExistingDelayedTasksAfterShutdownPolicy​(boolean value)

  • 作用:设置是否执行现有延迟任务的策略,即使此执行程序已执行shutdown

setRemoveOnCancelPolicy​(boolean value)

  • 作用:设置关于是否应在取消时立即从工作队列中删除已取消任务的策略。

shutdown()

  • 作用:启动有序关闭,其中先前提交的任务将被执行,但不会接受任何新任务。

shutdownNow()

  • 作用:尝试停止所有正在执行的任务,停止等待任务的处理,并返回等待执行的任务列表。

submit​(Runnable task)

  • 作用:提交Runnable任务以执行并返回表示该任务的Future。

submit​(Runnable task, T result)

  • 作用:提交Runnable任务以执行并返回表示该任务的Future。

submit​(Callable<T> task)

  • 作用:提交值返回任务以执行并返回表示任务的挂起结果的Future。

二、使用方法

/**
 * 定时任务
 */
private ScheduledThreadPoolExecutor scheduled;
if (scheduled == null) {
    scheduled = new ScheduledThreadPoolExecutor(2);
}
//延时1s,每隔300000(5分钟)毫秒执行一次run方法
if (scheduled != null) {
    /**
     * 0表示首次执行任务的延迟时间,5表示每次执行任务的间隔时间,TimeUnit.MINUTES执行的时间间隔数值单位
     * 间隔单位毫秒:TimeUnit.MILLISECONDS
     * 间隔单位秒:TimeUnit.SECONDS
     * 间隔单位分钟:TimeUnit.MINUTES
     * 间隔单位小时:TimeUnit.HOURS
     * 间隔单位天:TimeUnit.DAYS
     * scheduleAtFixedRate和scheduleWithFixedDelay的区别:
     * scheduleAtFixedRate:是上一个任务开始执行之后延迟设定时间再执行,是从上一个任务开始时计时,
     *                      但对于运行时长超过延迟时长的任务,会等上一个任务执行完之后,下一个任务才开始执行,
     *                      此时,延时没有任何意义。
     * scheduleWithFixedDelay:scheduleWithFixedDelay是在上一个任务结束执行之后延迟设定时间再执行,
     *                          是从上一个任务结束时开始计算。
     */
    scheduled.scheduleWithFixedDelay(new Runnable() {
        @Override
        public void run() {
          //这里执行定时任务
        }
    }, 0, 5, TimeUnit.MINUTES);
}

三、scheduleAtFixedRate和scheduleWithFixedDelay的区别

  •  scheduleAtFixedRate:是上一个任务开始执行之后延迟设定时间再执行,是从上一个任务开始时计时,  但对于运行时长                                        超过延迟时长的任务,会等上一个任务执行完之后,下一个任务才开始执行, 此时,延时没有任                                          何意义。
  • scheduleWithFixedDelay:scheduleWithFixedDelay是在上一个任务结束执行之后延迟设定时间再执行, 是从上一个任务                                             结束时开始计算。

 

 

 

 

 

 

 

 

ScheduledThreadPoolExecutor是Java并发包中用于定期执行任务的一个工具,它基于ThreadPoolExecutor,添加了调度功能。通过ScheduledThreadPoolExecutor,你可以安排任务在未来某个时间点执行,或者按照一定的时间间隔周期性地运行。 设置定时任务通常包括以下步骤: 1. **创建executor**: 首先,你需要创建一个ScheduledThreadPoolExecutor实例,比如: ```java ScheduledThreadPoolExecutor executor = new ScheduledThreadPoolExecutor(1); ``` 这里的数字1表示线程池大小,可以根据需求调整。 2. **提交任务**: 使用`schedule()`方法来指定任务何时开始执行,例如立即执行一次的命令: ```java Runnable task = () -> System.out.println("Task will run once."); executor.schedule(task, 0, TimeUnit.MILLISECONDS); // 0毫秒后执行 ``` 如果你想让任务每隔一段时间执行,可以使用`scheduleAtFixedRate()`或`scheduleWithFixedDelay()`方法,前者会在每个固定时间间隔执行,后者则是第一次延迟执行然后按照给定的间隔重复: ```java executor.scheduleAtFixedRate(task, initialDelay, period, TimeUnit.SECONDS); executor.scheduleWithFixedDelay(task, initialDelay, delay, TimeUnit.SECONDS); ``` 这里,initialDelay是首次执行的延迟,period/delay是执行间隔。 3. **取消任务**: 如果需要在任何时候取消任务,可以使用`cancel()`方法配合`Future`接口: ```java Future<?> future = executor.submit(task); future.cancel(true); // 取消任务,true表示立即中断任务 ``` 4. **关闭线程池**: 当所有任务完成后,记得关闭线程池以释放资源: ```java executor.shutdown(); // 或 shutdownNow() 来立即停止所有任务 ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值