java 定时器的三种方法

2333

记录一下

第一种:

创建一个 thread,然后让它在 while 循环里一直运行着,通过 sleep 方法来达到定时任务的效果,代码如下:

public class Test { public static void main(String[] args) { // 每秒中执行一次 final long timeInterval = 1000; Runnable runnable = () -> { while (true) { System.out.println(Thread.currentThread().getName() + ":Hello, Strange"); try { Thread.sleep(timeInterval); } catch (InterruptedException e) { e.printStackTrace(); } } }; // 创建定时器 Thread thread = new Thread(runnable); // 开始执行 thread.start(); System.out.println(Thread.currentThread().getName() + ":执行了"); } }

第二种

启动和取消任务时可以控制,可以指定你想要的 delay 时间,在实现时 Timer 类可以调度任务,TimerTask 则是通过在 run() 方法里实现具体任务。Timer 实例可以调度多任务,它是线程安全的,当 Timer 的构造器被调用时,它创建了一个线程,这个线程可以用来调度任务。具体实现如下:

public class Test { public static void main(String[] args) { /** * Timer: 是一个定时器工具,用来执行指定任务 * TimerTask: 是一个抽象类,它的子类 */ TimerTask timerTask = new TimerTask() { @Override public void run() { System.out.println("Hello, stranger"); } }; Timer timer = new Timer(); // 定义每次执行的间隔时间 long intervalPerion = 1 * 1000; // 安排任务在一段时间内运行 timer.scheduleAtFixedRate(timerTask, 0, intervalPerion); } }

第三种

相比上两种方法,它有以下好处:

  • 相比于 Timer 的单线程,它是通过线程池的方式来执行任务的
  • 可以很灵活的去设定第一次执行任务 delay 时间
  • 提供了良好的约定,以便设置执行的时间间隔
public class Test { public static void main(String[] args) { Runnable runnable = () -> { System.out.println("Hello, stranger"); }; /** * ScheduledExecutorService 在 jdk 1.5 的 java.util.concurrent 包里. * 做为并发工具类被引进的,这是最理想的定时任务实现方式。 */ ScheduledExecutorService service = Executors.newSingleThreadScheduledExecutor(); /** * 第二个参数为首次执行的延时时间,第三个参数为定时执行的间隔时间 * 5:秒,1:秒 * 第一次执行的时间为 5秒,然后每隔1秒执行一次。 */ service.scheduleAtFixedRate(runnable, 5, 1, TimeUnit.SECONDS); service.shutdown(); } }