2011-10-27 35 views
6

Hiện tại tôi đang sử dụng bộ hẹn giờ để thực hiện một số chức năng mỗi khoảng thời gian. Tuy nhiên, sau này khi tôi muốn thay đổi khoảng thời gian thực thi hàm, tôi không thể hủy lịch biểu trước đó. làm thế nào điều này có thể được giải quyết? Cảm ơncách hủy lịch biểu hiện có của bộ hẹn giờ

+0

ý của bạn là "tôi không thể hủy lịch trước đó"? bạn không biết làm thế nào để làm điều đó, hoặc là nó không phù hợp với kiến ​​trúc của bạn? – njzk2

+0

Tôi muốn hủy lịch trước đó và bắt đầu lịch biểu mới với khoảng thời gian khác nhau. Tuy nhiên, đối với bộ đếm thời gian, có vẻ như không có cách nào để làm điều này .. cũng bực bội – user301

+0

bạn phải thực sự hủy bỏ bộ hẹn giờ và tạo lại một – njzk2

Trả lời

5

Với phương thức timer.cancel(), bạn có thể hủy Bộ hẹn giờ và tất cả các tác vụ đã lên lịch. (Xem API documentation) hoặc bạn có thể gọi hủy bỏ phương pháp trên TimerTask bạn timertask.cancel() (xem API documentation)

Nếu bạn muốn thay đổi thời gian dự kiến, bạn nên hủy bỏ TimerTask và thêm một TimerTask mới.

+0

TimerTask # cancel và sau đó Timer # purge() không hoạt động. Nó vẫn chạy. – JohnyTex

3

Bạn có thể xem xét sử dụng ScheduledThreadPoolExecutor thay vì Timer.

Cách sử dụng khá thẳng về phía trước. Bạn tạo một thể hiện của một chấp hành viên:

ScheduledThreadPoolExecutor executor = new ScheduledThreadPoolExecutor(1); 

Và sau đó khi bạn muốn thêm một nhiệm vụ bạn gọi:

executor.scheduleAtFixedRate(myRunnable, delay, interval, unit); 

đâu myRunnable là nhiệm vụ của bạn (mà thực hiện các Runnable -interface), delay là bao lâu trước khi nhiệm vụ được thực hiện lần đầu tiên, interval là thời gian giữa việc thực hiện nhiệm vụ sau lần thực thi đầu tiên. delayinterval được đo lường dựa trên thông số unit, có thể là TimeUnit. * (Trong đó * là SECONDS, MINUTES, MILLISECONDS, v.v ...).

Sau đó, để ngăn chặn việc thực hiện bạn gọi:

executor.shutdownNow(); 

Và sau đó bạn có thể gửi lại nhiệm vụ của bạn với một khoảng thời gian khác nhau.

Lưu ý: Bạn có thể cần phải tạo một phiên bản mới của trình thực thi trước khi gửi lại tác vụ của bạn, nhưng tôi không hoàn toàn chắc chắn lý do.

+0

khác với hẹn giờ như thế nào? – njzk2

+0

Liên kết này cho bạn biết một chút về sự khác biệt: http://www.dremsus.com/index.php/2011/03/why-scheduledthreadpoolexecutor-for-smartfoxserver-2x/ Ngoài ra câu hỏi này trên Stackoverflow adresses sự khác biệt: http: //stackoverflow.com/questions/409932/java-timer-vs-executorservice – kaspermoerch

+0

là có anyway mà tôi không cần phải tắt các giám đốc điều hành hoặc đóng bộ đếm thời gian? Tôi không muốn tạo một thể hiện mới của đối tượng thi hành hoặc bộ đếm thời gian ... – user301

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