2010-02-16 23 views
9

Tôi đã là một nhiệm vụ theo lịch trình (chạy trong thi công chậm trễ cố định), bắt đầu như thế này:Cách chính xác để khởi động lại tác vụ theo lịch ScheduledExecutorService là gì?

executoreService.scheduleWithFixedDelay(repeatingThread, 0, numOfSeconds, TimeUnit.SECONDS); 

Trên mỗi đầu của chu kỳ, tôi kiểm tra cho một sự thay đổi trong một tập tin cài đặt, và sau đó tôi muốn khởi động lại nhiệm vụ . Tệp cài đặt cũng chứa khoảng thời gian (numOfSeconds trong mã ở trên).

Hiện nay, tôi đang sử dụng đoạn mã sau để khởi động lại nhiệm vụ:

executoreService.shutdownNow(); 
try { 
while(!executoreService.awaitTermination(5, TimeUnit.SECONDS)){ 
    logger.debug("awaiting termintation"); 
} 
} catch (InterruptedException e) { 
logger.debug("interrupted, continuing", e); 
} 
// initialize startup parameters 
init(); 
// start the main scheduled timer 
executoreService.scheduleWithFixedDelay(repeatingThread, 0, numOfSeconds, TimeUnit.SECONDS); 

Tôi không chắc chắn về những cuộc gọi API. Cách được khuyến nghị để khởi động lại tác vụ (có thể với sự chậm trễ mới) là gì?

Trả lời

13

Không, bạn không muốn hoặc cần tắt toàn bộ dịch vụ chỉ để sửa đổi một tác vụ. Thay vào đó, hãy sử dụng đối tượng ScheduledFuture mà bạn nhận được từ dịch vụ để hủy tác vụ và sau đó lên lịch một tác vụ mới.

ScheduledFuture<?> future = executorService.scheduleWithFixedDelay(repeatingThread, 0, numOfSeconds, TimeUnit.SECONDS); 
... 
// to cancel it: 
future.cancel(true); 
// then schedule again 

Ngoài ra, tại sao không chỉ cập nhật trạng thái trong bất kỳ điều gì lặp lạiThiết lập mới với thông số hoặc cài đặt mới? nó thậm chí không cần phải được lên lịch lại, nếu bạn không cần một sự chậm trễ mới.

+0

Đó là điều cần xem xét, nhưng việc triển khai nội dung nào đó sẽ bao gồm mọi thay đổi cài đặt sẽ dễ dàng hơn. tức là, bất kỳ thay đổi nào trong tệp cài đặt * cũng có thể * cũng thay đổi độ trễ. Vì vậy, thay vì kiểm tra xem sự chậm trễ đã được thay đổi và sau đó làm một điều, và nếu nó không phải là sau đó cái gì khác, sau đó tôi chỉ muốn khởi động lại trong mọi trường hợp. – Ovesh

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