Tôi đang sử dụng java.util.Timer để lên lịch một tác vụ định kỳ. Tại một thời điểm, tôi muốn tắt nó và đợi để hoàn thành.Đang đợi Bộ hẹn giờ kết thúc bằng Java
Timer.cancel() sẽ ngăn mọi tác vụ trong tương lai chạy. Làm cách nào để đảm bảo mọi tác vụ hiện không hoạt động (hoặc đợi cho chúng hoạt động?)
Tôi có thể giới thiệu cơ chế đồng bộ bên ngoài, nhưng tôi không thấy cách chúng có thể bao phủ tất cả các trường hợp. Ví dụ, nếu tôi đồng bộ hóa trên một số Màn hình trong tác vụ, tôi vẫn bỏ lỡ trường hợp khi tác vụ mới bắt đầu thực hiện nhưng không lấy màn hình.
Thực tiễn được khuyến nghị để chờ cho đến khi tất cả các tác vụ được thực hiện, bao gồm các tác vụ hiện đang chạy là gì?
+1. Hoặc, nếu bạn phải sử dụng một 'Timer' vì một lý do nào đó, thì bạn có thể sử dụng một điều kiện (http://java.sun.com/j2se/1.5.0/docs/api/java/util/concurrent/locks/ Condition.html) để đồng bộ hóa hai luồng trên một sự kiện (chẳng hạn như hoàn thành tác vụ theo lịch). –
Vâng, mục 68 trong Java hiệu quả (phiên bản 2) đề xuất ScheduledThreadPoolExecutor như là một sự thay thế linh hoạt hơn cho Bộ hẹn giờ. +1 để đề cập đến điều này, vì thực hành được đề xuất đã được yêu cầu. – Jonik
Vâng, tôi thực sự nên đọc cuốn sách đó. – ripper234