首先我要给大家介绍的是Timer这个类和ScheduledExecutorService这个类
java.util.Timer
java.util.concurrent.ScheduledExecutorService
神马?不知道我要讲什么,好吧 ,直接抛代码
现在用定时器,实现每三秒打印我一次,我很帅。实力三秒男 哈哈哈
方式一:用Timer类
import java.util.Timer;
import java.util.TimerTask;
public class TimerLesson {
public static long period = 3000;//3秒男
public static void main(String[] args) {
Timer timer = new Timer();
timer.scheduleAtFixedRate(new TimerTask() {
@Override
public void run() {
System.out.println("刘伊凡很帅");
}
}, period, period);
}
public void shutdown(Timer timer) {
timer.cancel();
}
}
方式一:用ScheduledExecutorService类
import java.util.concurrent.Executors;
import java.util.concurrent.ScheduledExecutorService;
import java.util.concurrent.ScheduledFuture;
import java.util.concurrent.TimeUnit;
public class ExecutorsLesson {
private static long period = 3;//3秒男
public static void main(String[] args) {
ScheduledExecutorService singleThreadScheduledExecutor = Executors.newSingleThreadScheduledExecutor();
singleThreadScheduledExecutor.scheduleAtFixedRate(new Runnable() {
@Override
public void run() {
System.out.println("刘伊凡很帅");
}
}, period, period, TimeUnit.SECONDS);
}
public void shutdown(ScheduledFuture<?> scheduleAtFixedRate) {
scheduleAtFixedRate.cancel(false);
}
}
技高一筹环节:
大家看到,这两段代码的执行都是创建了一个单独的线程实现了业务。到这里,就会想这两个不是他大舅他二舅都是他舅吗,没错,是这样,但我要说的是shutdown方法。大家看到两个实现的,cancel,ScheduledExecutorService 的cancel里面传一个boolean值,根据jdk的说明:- 如果应该中断执行此任务的线程,则为true;否则允许正在运行的任务运行完成,这个意思我理解的是,假若我们业务task的逻辑很长,在执行cancel的时候Timer会中断线程,而ScheduledExecutorService在cancel传false的时候,会执行完这一次的task,待下一次的task的时候中断。这个就厉害了,在真实的业务中我们当然希望我们控制手段更灵活,ScheduledExecutorService更符合我们的要求,做奸在床的时候是立即打断人家 还是等他们完事之后 这个就看你cancel用的6不6的时候了,去吧,骚年
当然在最后,当然要实现更复杂的定时任务,比如每周双休日执行task 或者每个节日执行task,我们就要借助quartz框架了,一般的业务需求,还是用原生的比较好,比较开销和简单性都很好,符合业务就行
TimerTask
cancel
public boolean cancel()
-
取消此计时器任务。如果任务安排为一次执行且还未运行,或者尚未安排,则永远不会运行。如果任务安排为重复执行,则永远不会再运行。(如果发生此调用时任务正在运行,则任务将运行完,但永远不会再运行。)
注意,从重复的计时器任务的 run 方法中调用此方法绝对保证计时器任务不会再运行。
此方法可以反复调用;第二次和以后的调用无效。
-
-
-
返回:
- 如果此任务安排为一次执行且尚未运行,或者此任务安排为重复执行,则返回 true。如果此任务安排为一次执行且已经运行,或者此任务尚未安排,或者此任务已经取消,则返回 false。(一般来说,如果此方法不允许发生一个或多个已安排执行,则返回 true。)
cancel
boolean cancel(boolean mayInterruptIfRunning)
-
试图取消对此任务的执行。如果任务已完成、或已取消,或者由于某些其他原因而无法取消,则此尝试将失败。当调用
cancel 时,如果调用成功,而此任务尚未启动,则此任务将永不运行。如果任务已经启动,则
mayInterruptIfRunning 参数确定是否应该以试图停止任务的方式来中断执行此任务的线程。
此方法返回后,对
isDone()
的后续调用将始终返回 true。如果此方法返回 true,则对isCancelled()
的后续调用将始终返回 true。 -
-
参数:
-
mayInterruptIfRunning
- 如果应该中断执行此任务的线程,则为 true;否则允许正在运行的任务运行完成
返回:
- 如果无法取消任务,则返回 false,这通常是由于它已经正常完成;否则返回 true
-