hymn

忽有故人心头过,回首山河已是秋。

  menu
132 文章
0 浏览
5 当前访客
ღゝ◡╹)ノ❤️

ScheduledThreadPool 细节

创建一个 ScheduledThreadPool仍然是通过 Executors类:

ScheduledExecutorService ses = Executors.newScheduledThreadPool(4);

我们可以提交一次性任务,它会在指定延迟后只执行一次:

// 1秒后执行一次性任务:
ses.schedule(new Task("one-time"), 1, TimeUnit.SECONDS);

如果任务以固定的每3秒执行,我们可以这样写:

// 2秒后开始执行定时任务,每3秒执行:
ses.scheduleAtFixedRate(new Task("fixed-rate"), 2, 3, TimeUnit.SECONDS);

如果任务以固定的3秒为间隔执行,我们可以这样写:

// 2秒后开始执行定时任务,以3秒为间隔执行:
ses.scheduleWithFixedDelay(new Task("fixed-delay"), 2, 3, TimeUnit.SECONDS);

注意FixedRate和FixedDelay的区别。FixedRate是指任务总是以固定时间间隔触发,不管任务执行多长时间:

│░░░░   │░░░░░░ │░░░    │░░░░░  │░░░  
├───────┼───────┼───────┼───────┼────>
│<─────>│<─────>│<─────>│<─────>│

而FixedDelay是指,上一次任务执行完毕后,等待固定的时间间隔,再执行下一次任务:

│░░░│       │░░░░░│       │░░│       │░
└───┼───────┼─────┼───────┼──┼───────┼──>
    │<─────>│     │<─────>│  │<─────>│

Q1:在FixedRate模式下,假设每秒触发,如果某次任务执行时间超过1秒,后续任务会不会并发执行?

A1:If any execution of this task takes longer than its period, then subsequent executions may start late, but will not concurrently execute.

译:如果此任务的任何执行时间超过其周期,则后续执行可能会延迟开始,但不会并发执行。

Q2:如果任务抛出了异常,后续任务是否继续执行?

A2:If any execution of the task encounters an exception, subsequent executions are suppressed.

译:如果任务的任何执行遇到异常,则将禁止后续任务的执行。


标题:ScheduledThreadPool 细节
作者:hymn
地址:https://dxyhymn.com/articles/2020/12/04/1607073480230.html