玩一玩java定时器

来源:互联网 发布:js select 不可编辑 编辑:程序博客网 时间:2024/06/11 06:48

首先我要给大家介绍的是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() {@Overridepublic 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() {@Overridepublic 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。)
ScheduledExecutorService

cancel

boolean cancel(boolean mayInterruptIfRunning)
试图取消对此任务的执行。如果任务已完成、或已取消,或者由于某些其他原因而无法取消,则此尝试将失败。当调用 cancel 时,如果调用成功,而此任务尚未启动,则此任务将永不运行。如果任务已经启动,则mayInterruptIfRunning 参数确定是否应该以试图停止任务的方式来中断执行此任务的线程。

此方法返回后,对 isDone() 的后续调用将始终返回 true。如果此方法返回 true,则对 isCancelled() 的后续调用将始终返回 true

参数:
mayInterruptIfRunning - 如果应该中断执行此任务的线程,则为 true;否则允许正在运行的任务运行完成
返回:
如果无法取消任务,则返回 false,这通常是由于它已经正常完成;否则返回 true

0 0