【Java定时器】: Java创建定时器的三种方式(详细讲解)
程序员文章站
2022-06-09 09:29:38
...
Java创建定时器的三种方式
第一种,常见的thread,创建一个Thread让他让循环里一直执行,通过 Thread.sleep 来达到 定时任务的效果。
栗子如下:
public static void main(String[] args) {
final long timeTnterval = 1000;
Runnable runnable = new Runnable() {
public void run() {
while (true){
System.out.println("I am a handsome");
try {
Thread.sleep(timeTnterval);
}catch (Exception e){
e.printStackTrace();
}
}
}
};
Thread thread = new Thread(runnable);
thread.start();
}
第二种,启动和取消任务都可以控制,可以指定你想要的delay时间(开始等待时间)。实现时,Timer类可以调度任务,而 TimerTask 类则是在run方法中实现具体任务;Timer可以调度多个任务,它是线程安全的。当 Timer 的构造函数被调用时,会创建一个线程,这个线程用来调用任务。
栗子如下:
public static void main(String[] args) throws ParseException {
TimerTask timerTask = new TimerTask() {
@Override
public void run() {
System.out.println("Hello !!");
}
};
SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd hh:mm:ss");
Date currentDate = simpleDateFormat.parse("2020-5-14 14:32:20");
Timer timer = new Timer();
// 2020-5-14 14:32:20 当前时间执行
timer.schedule(timerTask,currentDate);
}
注意: 由于Timer类不捕获异常, 在调度多任务时,只要其中一个任务的异常没有捕获,其它任务便会也就会自动停止,建议使用 ScheduledExecutorService 。也就时下面的第三种!
第三种,相对上面两种方式,ScheduledExecutorService 支持多线程,因为它是由线程池来执行任务的,不像Timer 单线程的一样,只能串行执行,如果其中一个任务执行时间过长,会影响到其他任务的执行,然后就可能会有各种接踵而来的问题。其次 ScheduledExecutorService 也在线程中捕获了异常,不至于出现像 Timer 类一样的问题。可以说是 Timer 类的完美替换者,即解决了单线程也处理了异常。所以推荐使用!
栗子如下:
public static void main(String[] args) {
Runnable runnable1 = new Runnable() {
public void run() {
System.out.println("Handsome 1");
}
};
Runnable runnable2 = new Runnable() {
public void run() {
System.out.println("Handsome 2");
}
};
ScheduledExecutorService service = Executors
.newSingleThreadScheduledExecutor();
/**
* 参数2:首次执行延迟时间
* 参数3:每次间隔执行时间
*/
//靓仔1号
service.scheduleAtFixedRate(runnable1, 5, 1, TimeUnit.SECONDS);
//靓仔2号
service.scheduleAtFixedRate(runnable2, 5, 1, TimeUnit.SECONDS);
}
第三种的结果:可以看到 靓仔1 靓仔2 同时在执行。
文章皆为学习记录,如有错误之处,欢迎指出一起学习,3q!