Create a task to run in an Interval

Khi ta phát huy app với java thỉnh thoảng ta sẽ gặp những thách thức tạo một xử lý chạy trên background trong một khoảng thời gian.
Ví dụ: gửi data lên server hay clean application…
Trong bài viết này mình xin giới thiệu với các bạn 3 cách để có thể giải quyết bài toán này trên java:

dùng Thread dùng TimerTask dùng ScheduledExecutorService

dùng Thread

Đây được xem là cách dễ hiểu và khá thân quen đối với nhiều coder. ta chỉ cần tạo một Thread và cho nó chạy mãi mãi bằng việc dùng một vòng lặp vô hạn và dùng Thread.sleep(timeInterval) để delay task

public class Task  { public static void main(String[] args) {   // run in a second   final long timeInterval = 1000;   Runnable runnable = new Runnable() {   public void run() {     while (true) {       // ------- code for task to run       System.out.println("Hello !!");       // ------- ends here       try {        Thread.sleep(timeInterval);       } catch (InterruptedException e) {         e.printStackTrace();       }       }     }   };   Thread thread = new Thread(runnable);   thread.start();   } } 

Việc bắt và xử lý ngoại lệ InterruptedException là rất cần vì nếu có ngoại lệ diễn ra thì task sẽ bị dừng lại ngay lập tức .

dùng TimerTask

dùng Thread là một cách nhanh và cài đặt khá rất dễ, mặc dù vậy nó lại có một vài giới hạn như:

Không kiểm soát được lúc công việc bắt đầu hoặc bị hủy Không giúp đỡ time delay cho lần thực hiện đầu tiên
Khi dùng TimerTask, nó có thể giúp đỡ ta giải quyết được những việc trên.
Để cài đặt ta sẽ dùng 2 đối tượng là Timer để lập lịch và TimerTask được dùng để thực hiện công việc trong hàm run()

public class Task {   public static void main(String[] args) {     TimerTask task = new TimerTask() {       @Override       public void run() {         // task to run goes here         System.out.println("Hello !!!");       }     };     Timer timer = new Timer();     long delay = 0;     long intevalPeriod = 1 * 1000;      // schedules the task to be run in an interval      timer.scheduleAtFixedRate(task, delay,                                 intevalPeriod);   } // end of main } 

dùng ScheduledExecutorService

Được giới thiệu trong gói java.util.concurrent từ java 5. ScheduledExecutorService là một cách được ưa thích để giải quyết bài toán của ta
Việc dùng ScheduledExecutorService sẽ đem lại cho ta một vài lợi ích như:

rất dễ cho việc delay lần thực hiện đầu tiên cung ứng những quy định cho việc cung ứng thời gian lặp lại task

ScheduledExecutorService có 3 method chính đó là:schedule(), scheduleWithFixedDelay(), scheduleAtFixedRate().
Thường ta sẽ dùng 2 phuơng thức đó là: scheduleWithFixedDelay() và scheduleAtFixedRate().

Nói qua về sự khách nhau giữa 2 method này thì scheduleAtFixedRate()scheduleWithFixedDelay() đều nhận vào những tham số giống nhau đó là một Runnable để thực thi task, thời gian delay trong lần thực thi đầu tiên, thời gian nghỉ và tham số sau cùng là đơn vị thời gian. mặc dù vậy chúng lại có những điểm khác nhau về cách thực thi, scheduleWithFixedDelay() sẽ đợi cho task thực thi xong và tiếp tục chờ hết thời gian nghỉ tiếp theo mới thực thi lại task đó, còn scheduleAtFixedRate() sẽ thực thi task sau mỗi một khoảng thời gian nghỉ.

public static void main(String[] args) {     Runnable runnable = new Runnable() {       public void run() {         // task to run goes here         System.out.println("Hello !!");       }     };     ScheduledExecutorService service = Executors                     .newSingleThreadScheduledExecutor();     service.scheduleAtFixedRate(runnable, 0, 1, TimeUnit.SECONDS);   } 

quan tâm:
Khi dùng ScheduledExecutorServiceTimerTask ta sẽ tránh được InterruptedException mặc dù vậy nếu trong hàm run() có diễn ra ngoại lệ thì task cũng sẽ bị dừng lại vì vậy ta cần xem xét đến các hoàn cảnh gây ra ngoại lệ và sử lý bắt ngoại lệ tại đây.
Hy vọng những cách trên có thể hữu ích với các bạn!!!
Tham khảo:
https://lập trình viêneloper.android.com/reference/java/util/concurrent/ScheduledThreadPoolExecutor.html

Nguồn viblo.asia