2010-08-22 33 views

Trả lời

70

Trong Java 5 + với một ScheduledExecutorService:

ScheduledExecutorService exec = Executors.newSingleThreadScheduledExecutor(); 
exec.scheduleAtFixedRate(new Runnable() { 
    @Override 
    public void run() { 
    // do stuff 
    } 
}, 0, 5, TimeUnit.SECONDS); 

Các phương pháp trên được ưa chuộng. Trước Java 5 bạn sử dụng TimerTimerTask:

timer.scheduleAtFixedRate(new TimerTask() { 
    @Override 
    public void run() { 
    // do staff 
    } 
}, 0, 5000); 
+5

gì xảy ra nếu tôi đóng cửa sổ chính của ứng dụng? tác vụ này sẽ vẫn chạy? – Tomasz

8

Bằng cách sử dụng ScheduledExecutorService.

Hãy xem Executors.newScheduledThreadPool. Nó sẽ cho phép bạn tạo ra một ScheduledExecutorService cho phép bạn gửi Runnable s để được thực thi theo các khoảng thời gian đều đặn.

3
while (true) { 
    thread.sleep(1000) 
    method(); 
} 

Trong nhiều trường hợp sẽ có lựa chọn thay thế tốt hơn. Nhưng đây là cách dễ nhất để triển khai thực hiện thường xuyên phương thức của bạn() tại một khoảng thời gian 1000ms + n (trong đó n là khoảng thời gian thực hiện phương thức thực hiện())

Tất nhiên thay vì 1000, bạn có thể đặt bất kỳ giá trị mili giây nào bạn mong muốn. Nó cũng có thể là một ý tưởng để thực hiện vòng lặp while trên một cờ mà một điều khiển luồng khác; để có một cách để ngừng thực hiện vòng lặp mà không phải giết chương trình.

+2

gần như - nó sẽ có ít nhất 1000. Nó phụ thuộc khi bộ lập lịch trình chủ đề quyết định bắt đầu chạy lại chuỗi. Nó sẽ là 1000 + a + n (trong đó a là thời gian để trình lập lịch biểu kích hoạt lại chuỗi) – RNJ

1

Sử dụng mã dưới đây:

Timer timer = new Timer(); 
timer.schedule(new TimerTask() 
{ 
    public void run() { 
    // do your work 
    } 
}, 0, 60*(1000*1));