美文网首页Java并发编程
Java并发编程 - ScheduledExecutorServ

Java并发编程 - ScheduledExecutorServ

作者: HRocky | 来源:发表于2019-05-17 11:19 被阅读0次

一、Delayed接口

API说明如下:

一种混合风格的接口,用来标记那些应该在给定延迟时间之后执行的对象。
此接口的实现必须定义一个 compareTo 方法,该方法提供与此接口的 getDelay 方法一致的排序。

接口方法定义如下:

/**
 * 返回与此对象相关的剩余延迟时间,以给定的时间单位表示。
 * @param unit 时间单位
 * @return 剩余延迟时间;零或负值指示延迟时间已经用尽
 */
long getDelay(TimeUnit unit);

由上面的API描述可以看出这接口其实就是个标记接口,实现了这个接口的对象提供延迟执行的功能,我们知道延迟执行跟时间是有关系的,比如说隔多久后执行,也就是说对象创建之后到执行是有个延迟时间的。该接口定义了一个方法getDelay来获取对象剩余的延迟时间。

二、ScheduledExecutorService

ScheduledExecutorService在ExecutorService提供的功能之上再增加了延迟和定期执行任务的功能。

API描述如下:

ExecutorService可以调度命令在给定的延迟之后运行,或定期执行。

schedule方法创建具有各种延迟的任务,并返回可用于取消或检查执行的任务对象。scheduleAtFixedRate和scheduleWithFixedDelay方法创建并执行定期运行的任务,直到取消。

使用Executor.execute(Runnable)和ExecutorService submit方法提交的命令以请求的延迟为零进行调度。 在schedule方法中也允许零和负延迟(但不是周期),并被视为立即执行的请求。

所有的schedule方法都接受相对延迟和周期作为参数,而不是绝对的时间或日期。将以Date所表示的绝对时间转换成要求的形式很容易。例如,要安排在某个以后的 Date运行,可以使用:schedule(task, date.getTime() - System.currentTimeMillis(), TimeUnit.MILLISECONDS)。但是要注意,由于网络时间同步协议、时钟漂移或其他因素的存在,因此相对延迟的期满日期不必与启用任务的当前Date 相符。 Executors类为此包中所提供的ScheduledExecutorService实现提供了便捷的工厂方法。

用法示例

以下是一个带方法的类,它设置了 ScheduledExecutorService ,在 1 小时内每 10 秒钟蜂鸣一次:

import static java.util.concurrent.TimeUnit.*;

class BeeperControl {
   private final ScheduledExecutorService scheduler =
     Executors.newScheduledThreadPool(1);

   public void beepForAnHour() {
     final Runnable beeper = new Runnable() {
       public void run() { System.out.println("beep"); }
     };
     final ScheduledFuture<?> beeperHandle =
       scheduler.scheduleAtFixedRate(beeper, 10, 10, SECONDS);
     scheduler.schedule(new Runnable() {
       public void run() { beeperHandle.cancel(true); }
     }, 60 * 60, SECONDS);
   }
 }

接口方法

/**
 * 创建并执行在给定延迟后启用的一次性操作
 *
 * @param command 要执行的任务 
 * @param delay 从现在开始延迟执行的时间 
 * @param unit 延时参数的时间单位 
 * @return 表示任务等待完成,并且其的ScheduledFuture get()方法将返回 null完成后 
 * @throws RejectedExecutionException 如果任务无法安排执行 
 * @throws NullPointerException 如果命令为空 
 */
public ScheduledFuture<?> schedule(Runnable command,
                                   long delay, TimeUnit unit);

/**
 * 创建并执行在给定延迟后启用的ScheduledFuture。 
 *
 * @param callable 执行的功能 
 * @param delay 从现在开始延迟执行的时间 
 * @param unit 延迟参数的时间单位 
 * @param <V> the 可调用结果的类型 
 * @return一个可用于提取结果或取消的ScheduledFuture 
 * @throws RejectedExecutionException 如果该任务无法安排执行 
 * @throws NullPointerException 如果callable为空 
 */
public <V> ScheduledFuture<V> schedule(Callable<V> callable,
                                       long delay, TimeUnit unit);

/**
 * 创建并执行一个在给定初始延迟后首次启用的定期操作,后续操作具有给定的周期;也就是将在initialDelay后开始执行,然后在 
 * initialDelay+period后执行,接着在initialDelay + 2 * period后执行,依此类推。 
 * 如果任务的执行遇到异常,则后续的执行被抑制。 否则,任务将仅通过取消或终止执行人终止。
 * 如果任务执行时间比其周期长,则后续执行可能会迟到,但不会同时执行。 
 *
 * @param command 要执行的任务 
 * @param initialDelay 首次执行的延迟时间
 * @param period 连续执行之间的周期
 * @param unit initialDelay和period参数的时间单位 
 * @return 一个ScheduledFuture代表待完成的任务,其 get()方法将在取消时抛出异常 
 * @throws RejectedExecutionException 如果任务无法安排执行 
 * @throws NullPointerException 如果命令为空 
 * @throws IllegalArgumentException 如果period小于或等于零 
 */
public ScheduledFuture<?> scheduleAtFixedRate(Runnable command,
                                              long initialDelay,
                                              long period,
                                              TimeUnit unit);

/**
 * 创建并执行一个在给定初始延迟后首次启用的定期操作,随后,在每一次执行终止和下一次执行开始之间都存在给定的延迟。
*  如果任务的执行遇到异常,则后续的执行被抑制。 否则,任务将仅通过取消或终止执行人终止。 
 *
 * @param command 要执行的任务 
 * @param initialDelay 首次执行的延迟时间
 * @param delay 一次执行终止和下一次执行开始之间的延迟
 * @param unit initialDelay和delay参数的时间单位
 * @return 表示挂起任务完成的ScheduledFuture,并且其get()方法在取消后将抛出异常
 * @throws RejectedExecutionException 如果任务不能安排执行 
 * @throws NullPointerException 如果command为null
 * @throws IllegalArgumentException 如果delay小于等于0
 */
public ScheduledFuture<?> scheduleWithFixedDelay(Runnable command,
                                                 long initialDelay,
                                                 long delay,
                                                 TimeUnit unit);

相关文章

网友评论

    本文标题:Java并发编程 - ScheduledExecutorServ

    本文链接:https://www.haomeiwen.com/subject/jwhnaqtx.html