Code ví dụ Java đặt lịch với Timer, TimerTask

Code ví dụ Java đặt lịch với Timer, TimerTask.

1. Timer và TimerTask trong Java

TimerTimerTask là hai class trong package java.util được sử dụng để lên lịch cho một công việc và chạy nó trong background với 1 thread.

TimerTask là công việc được thực thi còn Timer là lịch trình thực thi.

2. Code ví dụ Timer, TimerTask

Tạo Project Java:

Code ví dụ Java đặt lịch với Timer, TimerTask

Cấu trúc Project

Code ví dụ Java đặt lịch với Timer, TimerTask

Tạo Task bằng cách thừa kế TimerTask:

Task của mình chỉ đơn giản là in ra màn hình “Run my Task” + thời gian hiện tại

package stackjava.com.timertaskexp;

import java.util.Date;
import java.util.TimerTask;

public class MyTask extends TimerTask {

  @Override
  public void run() {
    System.out.println("Run my Task " + new Date());
  }

}

Tiếp theo ta sử dụng Timer để lên lịch cho task vừa tạo

2.1 Chạy task 1 lần với Timer:

package stackjava.com.timertaskexp;

import java.util.Calendar;
import java.util.Date;
import java.util.Timer;

public class DemoTaskOnce {
  public static void main(String[] args) {
    MyTask myTask = new MyTask();
    Timer timer = new Timer();
    System.out.println("Currnet time: " + new Date());
    timer.schedule(myTask, 5000);
    
//		Calendar calendar = Calendar.getInstance();
//		calendar.add(Calendar.SECOND, 5);
//		Date dateSchedule = calendar.getTime();
//		timer.schedule(myTask, dateSchedule);
  }

}

Tham số của method schedule() gồm task được thực thi và thời gian delay (sau bao lâu thì chạy) ở đây mình để là sau 5s thì thực thi task:

Kết quả khi chạy class trên:

Code ví dụ Java đặt lịch với Timer, TimerTask

Tương tự, thay vì truyền vào thời gian delay, ta có thể truyền tham số kiểu Date để chỉ định khi nào thì chạy:

Calendar calendar = Calendar.getInstance();
calendar.add(Calendar.SECOND, 5);
Date dateSchedule = calendar.getTime();
timer.schedule(myTask, dateSchedule);

2.2 Chạy task lặp lại nhiều lần với Timer:

package stackjava.com.timertaskexp;

import java.util.Timer;

public class DemoTaskRepeat {
  public static void main(String[] args) {
    MyTask myTask = new MyTask();
    Timer timer = new Timer();
    timer.schedule(myTask, 0, 2000);
  }

}

Trong method schedule() ngoài thời gian delay ta có thể truyền thêm tham số để xác định sau bao lâu thì task được lặp lại.

Trong ví dụ này của mình task chạy ngay lập tức, và cứ sau 2s thì lặp lại 1 lần:

Demo:

Code ví dụ java timer, timertask

2.3 Chạy task chạy hàng ngày với Timer:

Ví dụ mình muốn cứ vào 5h30 sáng hàng ngày thì task được thực hiện một lần:

  • Tạo dateSchedule với thời gian là 5:30:00
  • Tạo period với giá trị là số miliseconds trong 24h.
package stackjava.com.timertaskexp;

import java.util.Calendar;
import java.util.Date;
import java.util.Timer;

public class DemoTaskDaily {
  public static void main(String[] args) {
    MyTask myTask = new MyTask();

    Calendar calendar = Calendar.getInstance();
    calendar.set(Calendar.HOUR_OF_DAY, 5);
    calendar.set(Calendar.MINUTE, 30);
    calendar.set(Calendar.SECOND, 0);
    calendar.set(Calendar.MILLISECOND, 0);

    Date dateSchedule = calendar.getTime();
    long period = 24 * 60 * 60 * 1000;
    
    Timer timer = new Timer();
    timer.schedule(myTask, dateSchedule, period);
  }

}

Tương tự các bạn có thể tạo task chạy hàng tuần, hàng tháng…

 

Okay, Done!

Download code ví dụ trên tại đây.

 

References:

https://docs.oracle.com/…/Timer.html

stackjava.com