注:本文只介绍了两种jdk自带的两种任务调度器,根据实际情况使用。更多更复杂的调度需求可以使用Quartz

1. JDK TimerTask

  • 介绍

    Timer 适用于简单任务调度,相当于线程休眠后执行task。
    所有任务都是由同一个线程来调度,因此所有任务都是串行执行的,
    同一时间只能有一个任务在执行,前一个任务的延迟或异常都将会影响到之后的任务。

  • 使用方法

    其中 Timer 负责设定 TimerTask 的起始与间隔执行时间。使用者只需要创建一个 TimerTask 的继承类,实现自己的 run 方法,然后将其丢给 Timer 去执行即可。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
public class TimerTest extends TimerTask {
private String jobName = "";
public TimerTest(String jobName) {
super();
this.jobName = jobName;
}
@Override
public void run() {
System.out.println("execute " + jobName);
}
public static void main(String[] args) throws InterruptedException {
Timer timer = new Timer();
long delay1 = 1 * 1000;
long period1 = 1000;
// 从现在开始 1 秒钟之后,每隔 1 秒钟执行一次 job1
timer.schedule(new TimerTest("job1"), delay1, period1);
long delay2 = 2 * 1000;
long period2 = 2000;
// 从现在开始 2 秒钟之后,每隔 2 秒钟执行一次 job2
timer.schedule(new TimerTest("job2"), delay2, period2);
}
}

2. JDK ScheduledExecutor

  • 介绍

    Java 5 推出了基于线程池设计的 ScheduledExecutor
    原理:

    1. 每一个被调度的任务都会由线程池中一个线程去执行,因此任务是并发执行的,相互之间不会受到干扰。
    2. 需要注意的是,只有当任务的执行时间到来时,ScheduedExecutor 才会真正启动一个线程,其余时间 ScheduledExecutor 都是在轮询任务的状态。
  • 使用方法
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
import java.util.concurrent.Executors;
import java.util.concurrent.ScheduledExecutorService;
import java.util.concurrent.TimeUnit;
public class ScheduledExecutorTest implements Runnable {
private String jobName = "";
public ScheduledExecutorTest(String jobName) {
super();
this.jobName = jobName;
}
@Override
public void run() {
System.out.println("execute " + jobName);
}
public static void main(String[] args) {
//初始化线程池
ScheduledExecutorService service = Executors.newScheduledThreadPool(10);
long initialDelay1 = 1;
long period1 = 1;
// 从现在开始1秒钟之后,每隔1秒钟执行一次job1。ScheduleAtFixedRate:每次执行时间为上一次任务开始起向后推一个时间间隔
service.scheduleAtFixedRate(new ScheduledExecutorTest("job1"),
initialDelay1, period1, TimeUnit.SECONDS);
long initialDelay2 = 1;
long delay2 = 1;
// 从现在开始2秒钟之后,每隔2秒钟执行一次job2。scheduleWithFixedDelay:每次执行时间为上一次任务结束起向后推一个时间间隔
service.scheduleWithFixedDelay(new ScheduledExecutorTest("job2"),
initialDelay2, delay2, TimeUnit.SECONDS);
}
}
文章目录
  1. 1. 1. JDK TimerTask
    1. 1.0.1. 介绍
    2. 1.0.2. 使用方法
  • 2. 2. JDK ScheduledExecutor
    1. 2.0.1. 介绍
    2. 2.0.2. 使用方法
  • Sides

    IT技术分享博客