2013-04-18 26 views
12

Tôi đang bối rối về javadoc của phương thức ExecutorService#shutdown. Không phải những tuyên bố mâu thuẫn này sao?ExecutorService shutdown

Bắt đầu tắt máy theo thứ tự mà các tác vụ đã gửi trước đó là được thực thi, nhưng sẽ không có nhiệm vụ mới nào được chấp nhận. Phương thức này không chờ đợi cho các tác vụ đã gửi trước đó để hoàn thành việc thực thi. Sử dụng đang chờĐiều chỉnh để thực hiện điều đó.

Nếu nó có thể tự tắt máy các tác vụ đã gửi trước đó, thì làm sao để nó có thể đợi để chúng hoàn thành việc thực hiện?

+0

Nhận xét có nghĩa là các tác vụ trước đó sẽ không bị hủy. Không phải là họ sẽ bị xử tử ngay lập tức. Sử dụng 'awaitTermination()' cho điều đó. –

+0

Thường lệ trả về gần như ngay lập tức thay vì chờ đợi cho tất cả các nhiệm vụ để hoàn thành. –

Trả lời

13

Điều này có nghĩa là phương thức trả về ngay lập tức trong chuỗi mà bạn gọi nó, nhưng các tác vụ chưa được thực hiện vẫn có thể đang chạy, trong các chủ đề khác.

Nếu bạn muốn chương trình của mình đợi cho đến khi các tác vụ đã được gửi trước đó đã hoàn tất, bạn phải gọi awaitTermination sau khi gọi shutdown.

+0

Chính xác, nó đơn giản tách hai mối quan tâm. Có thể có một số trường hợp bạn muốn tắt máy mà không cần chờ đợi. – user1225148

+0

Tôi có thể tưởng tượng gọi awaitTermination() là một cái gì đó như gọi .join() trên cá thể ExecutorService? Nếu tôi không gọi awaitTermination(), trong trường hợp đó thread chính (hoặc thread người gọi, chính xác) tiếp tục cùng với các chuỗi ExecutorService đồng thời. Nếu tôi gọi awaitTermination(), luồng chính sẽ dừng thực hiện cho đến khi các chuỗi ExecutorService được thực hiện. Vui lòng xác nhận xem sự hiểu biết của tôi có chính xác không? – RuntimeException

6

Điều đó có nghĩa là các tác vụ sẽ chạy đến khi hoàn thành, nhưng phương pháp này sẽ trở lại ngay lập tức mà không phải đợi điều đó xảy ra.

Vì vậy, để sạch shutdown thi hành di chúc của bạn mà không giết chết bất kỳ nhiệm vụ, bạn sẽ làm gì:

executor.shutdown(); 
executor.awaitTermination(long timeout, TimeUnit unit); 

Ngoài ra, nếu bạn chỉ muốn dừng thi hành di chúc của bạn càng nhanh càng tốt, sử dụng shutdownNow().

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