2015-06-09 13 views
6

Chúng tôi muốn lên lịch một quá trình java để chạy cho đến một khoảng thời gian cụ thể. Hiện tại tôi đang nghĩ đến việc sử dụng TimerTask để lên lịch cho quá trình này. Khi bắt đầu mỗi vòng lặp, sẽ kiểm tra thời gian hiện tại và sau đó so sánh với thời gian đã cho và ngừng quá trình nếu thời gian trôi qua. Mã của chúng tôi giống như sau:Lập lịch trình java cho một khoảng thời gian cụ thể với một độ trễ nhất định

import java.util.Timer; 
import java.util.TimerTask; 

public class Scheduler extends TimerTask{ 

    public void run(){ 
     //compare with a given time, with getCurrentTime , and do a System.exit(0); 
     System.out.println("Output"); 
    } 

    public static void main(String[] args) { 
     Scheduler scheduler = new Scheduler(); 
     Timer timer = new Timer(); 
     timer.scheduleAtFixedRate(scheduler, 0, 1000); 

    } 

} 

Có cách tiếp cận nào tốt hơn cho điều này không?

Trả lời

3

Thay vì kiểm tra xem đã đạt đến giới hạn thời gian trong mọi lần lặp lại, bạn có thể lên lịch một tác vụ khác trong khoảng thời gian đã nêu và hủy cuộc gọi trên bộ hẹn giờ của bạn.

Tùy thuộc vào độ phức tạp bạn có thể xem xét sử dụng ScheduledExecutorService như ScheduledThreadPoolExecutor. See in this answer when and why.

Ví dụ đơn giản làm việc với timer:

public class App { 
    public static void main(String[] args) { 
     final Timer timer = new Timer(); 
     Timer stopTaskTimer = new Timer(); 
     TimerTask task = new TimerTask() { 
      @Override 
      public void run() { 
       System.out.println("Output"); 
      } 
     }; 
     TimerTask stopTask = new TimerTask() { 
      @Override 
      public void run() { 
       timer.cancel(); 
      } 
     }; 

     //schedule your repetitive task 
     timer.scheduleAtFixedRate(task, 0, 1000); 
     try { 
      SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); 
      Date date = sdf.parse("2015-06-09 14:06:30"); 
      //schedule when to stop it 
      stopTaskTimer.schedule(stopTask, date); 
     } catch (ParseException e) { 
      e.printStackTrace(); 
     } 
    } 
} 
+0

Cảm ơn approach.I có thể thử này. – Anupam

+0

Tôi đã cập nhật câu trả lời bằng một ví dụ. –

+0

Cảm ơn bạn đã lấy mẫu mã. Chúng tôi có thể sẽ đi với ScheduledExecutorService, nhưng bây giờ, các mã trên sẽ làm việc hoàn hảo cho chúng tôi. – Anupam

2

Bạn có thể sử dụng RxJava, thư viện rất mạnh mẽ để lập trình phản ứng.

Observable t = Observable.timer(0, 1000, TimeUnit.MILLISECONDS); 
t.subscribe(new Action1() { 
         @Override 
         public void call(Object o) { 
          System.out.println("Hi "+o); 
         } 
        } 

) ; 
try { 
    Thread.sleep(10000); 
}catch(Exception e){ } 

Bạn thậm chí có thể sử dụng cú pháp lambda:

Observable t = Observable.timer(0, 1000, TimeUnit.MILLISECONDS); 
t.forEach(it -> System.out.println("Hi " + it)); 
try { 
    Thread.sleep(10000); 
}catch(Exception e){ } 
Các vấn đề liên quan