2012-02-14 5 views

Trả lời

30

Để thực hiện việc này, bạn cần phải submit() một nhiệm vụ đến số ExecutorService, thay vì gọi số execute(). Khi bạn làm điều này, một trả lại là Future có thể được sử dụng để thao tác tác vụ được lên lịch. Cụ thể, bạn có thể gọi cancel(true) trên số Future được liên kết để làm gián đoạn tác vụ hiện đang thực thi (hoặc bỏ qua hoàn toàn việc thực hiện nếu tác vụ chưa bắt đầu chạy).

Nhân tiện, đối tượng được trả về theo số Executors.newSingleThreadExecutor() thực ra là ExecutorService.

+2

Để làm việc này, bạn không phải tự đảm bảo rằng chuỗi có thể gián đoạn. Không phải tất cả các luồng đều có thể bị gián đoạn. - Dù sao thì tôi cũng nghĩ vậy. –

+2

Có, điều này mô tả cách làm gián đoạn luồng đang chạy tác vụ. Cho dù nhiệm vụ phản ứng với sự gián đoạn hay không là một câu hỏi hoàn toàn khác. Điều đó phụ thuộc vào nhiệm vụ đang làm. – erickson

+0

@erickson Tôi cũng có câu hỏi tương tự [ở đây] (http://stackoverflow.com/questions/29159184/how-can-i-interrupt-resttemplate-call-as-soon-as-my-thread-is-interrupted) liên quan đến gián đoạn chuỗi. Nếu có thể, bạn có thể giúp tôi ở ngoài kia không. Tôi chưa nhận được bất kỳ phản hồi nào vì vậy mọi trợ giúp sẽ được đánh giá cao. – john

4

Một cách khác để làm gián đoạn chuỗi được quản lý nội bộ của người thực hiện là gọi phương thức shutdownNow(..) trên số ExecutorService của bạn. Tuy nhiên, lưu ý rằng ngược lại với giải pháp @ erickson, điều này sẽ dẫn đến việc toàn bộ số ThreadPoolExecutor trở nên không phù hợp để sử dụng thêm.

Tôi thấy phương pháp này đặc biệt hữu ích trong trường hợp ExecutorService không còn cần thiết và giữ các tab trên các trường hợp Future là không cần thiết (ví dụ chính là phương pháp exit(..) của ứng dụng của bạn).

thông tin có liên quan từ ExecutorService#shutdownNow(..) javadocs:

nỗ lực để ngăn chặn tất cả các nhiệm vụ chủ động thực hiện, tạm dừng việc xử lý các nhiệm vụ chờ đợi, và trả về một danh sách các nhiệm vụ đã được chờ thực hiện.

Không có đảm bảo nào ngoài nỗ lực hết sức nỗ lực để ngừng xử lý chủ động thực hiện các tác vụ. Ví dụ, việc triển khai điển hình sẽ hủy qua Thread.interrupt, vì vậy bất kỳ tác vụ nào không phản hồi lại các ngắt có thể không bao giờ chấm dứt.