Code ví dụ Java đặt lịch với Timer, TimerTask.
1. Timer và TimerTask trong Java
Timer
và TimerTask
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:
Cấu trúc Project
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:
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:
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: