2012-01-29 36 views
9

Tôi muốn có một lớp thay đổi các biến riêng của riêng mình sau mỗi 2 giây. Tôi biết rằng nếu tôi làm điều gì đó nhưTạo lời nhắc hẹn giờ lặp lại trong Java

import java.util.Timer; 
//... 
Timer timer; 
//... 
timer.schedule(new ChangeSomething(), 2000); 

Nó sẽ thực hiện ChangeSomething() sau 2 giây, liệu có cách nào để nói nó để làm một cái gì đó mỗi 2 giây, hoặc, Nếu tôi đặt bên ChangeSomething()

timer.schedule(new ChangeSomething(), 2000); 

nó sẽ hoạt động?

Mặt khác, timer.cancel() chính xác là gì?

Trả lời

11

Sử dụng timer.scheduleAtFixedRate() đặt lịch để tái diễn mỗi hai giây:

Lịch nhiệm vụ theo quy định để thực hiện lãi suất cố định lặp đi lặp lại, bắt đầu từ thời gian quy định. Các lần thực hiện tiếp theo diễn ra trong khoảng thời gian đều đặn, được phân cách bởi khoảng thời gian đã chỉ định.

Từ javadoc cho Timer.cancel():

Chấm dứt hẹn giờ này, loại bỏ bất kỳ nhiệm vụ hiện theo lịch trình. Không can thiệp vào một nhiệm vụ hiện đang thực hiện (nếu nó tồn tại). Khi bộ hẹn giờ đã bị chấm dứt, chuỗi thực thi của nó chấm dứt một cách duyên dáng và không thể thực hiện thêm tác vụ nào trên đó.

EDIT:

liên quan đến chủ đề thực hiện nội bộ cho một Timer mà thực hiện một nhiệm vụ duy nhất một lần:

Sau khi tham khảo trực tiếp cuối cùng để một đối tượng Timer sẽ biến mất và tất cả xuất sắc nhiệm vụ đã hoàn thành thực thi, chuỗi thực thi tác vụ của trình hẹn giờ chấm dứt một cách duyên dáng (và trở thành đối tượng thu gom rác). Tuy nhiên, điều này có thể mất nhiều thời gian tùy ý. Theo mặc định, chuỗi thực hiện nhiệm vụ không chạy như một chuỗi daemon, vì vậy nó có khả năng giữ một ứng dụng khỏi kết thúc. Nếu người gọi muốn chấm dứt chuỗi thực hiện nhiệm vụ của bộ hẹn giờ nhanh, người gọi nên gọi phương thức hủy của bộ hẹn giờ.

+0

Những gì tôi không hiểu về timer.cancel(), là cho dù đó là cần thiết để làm sau khi tôi thực hiện một nhiệm vụ đó là được dự kiến ​​chỉ một lần để đảm bảo rằng nó sẽ không được thực hiện một lần nữa hay không? – SIMEL

+0

Javadoc cho 'Timer' cho biết điều này là không cần thiết và chuỗi exeecution của timer sẽ chấm dứt. Tuy nhiên, nó đặc biệt nói rằng điều này có thể mất một thời gian dài tùy ý và 'cancel()' có thể được sử dụng để chấm dứt nó nhanh hơn. (Đã dán đoạn có liên quan từ Javadoc vào câu trả lời). – hmjd

0

Để chính xác hơn ở đây: ChangeSomething() là hàm tạo của lớp ChangeSomething của bạn. Hàm khởi tạo sẽ được thực thi ngay lập tức khi bạn truyền đối tượng instace ChangeSomething đến bộ đếm thời gian, không phải sau 2 giây. Đó là phương thức run() của đối tượng sẽ được kích hoạt sau 2 giây.

Để thực hiện phương pháp run() lặp đi lặp lại tất cả 2 giây, sử dụng schedule(TimerTask task, long delay, long period)

6

Bạn sẽ cần phải gọi đến một phương pháp khác nhau của lịch hẹn giờ, được gọi là scheduleAtFixedRate (...) mà có thể nhận được 3 thông số. 2 đầu tiên giống hệt với lịch biểu bạn đã sử dụng, trong khi tham số thứ ba chỉ ra một khoảng thời gian tính bằng mili giây giữa các lần thực thi tác vụ kế tiếp.

import java.util.Timer; 
//... 
Timer timer; 
//... 
timer.scheduleAtFixedRate(new ChangeSomething(), 2000, 2000); 

Bạn có thể kiểm tra tài liệu java pai cho phương pháp này tại đây: http://docs.oracle.com/javase/6/docs/api/java/util/Timer.html#scheduleAtFixedRate(java.util.TimerTask, java.util.Ngày, dài)

2

Dưới đây là một ví dụ

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

public class Test extends TimerTask { 
    private int age; 

    public Test() { 
     Timer timer = new Timer(); 
     timer.scheduleAtFixedRate(this, new Date(), 2000); 
    } 

    /** 
    * Implements TimerTask's abstract run method. 
    */ 
    public void run(){ 
     //toy implementation 
     System.out.print("Changing Data ... before change age is "+age+" "); 
     changeAge(); 
     System.out.println("after change age is "+age); 

    } 


    private void changeAge() { 
     age = (int)Math.round(Math.random()*1000); 
    } 

    public static void main(String[] args) { 
      new Test(); 
    } 

}

+0

Timer mới(); = không bạn có thể cần phải thêm các thông số phải không? –

+0

@SvenB Theo Tài liệu Java: http://docs.oracle.com/javase/7/docs/api/java/util/Timer.html, Bộ hẹn giờ có một hàm tạo mặc định. –

Các vấn đề liên quan