2012-12-18 18 views
7

Tôi đã thực hiện đăng ký trong ứng dụng Java của mình. Khi thuê bao mới được bổ sung, các ứng dụng tạo ra nhiệm vụ mới (lớp mà thực hiện Runnable được chạy trong thread riêng biệt) và nó sẽ được thêm vào ExecutorService như:Dừng một Runnable được gửi đến ExecutorService

public void Subscribe() 
{ 
    es_.execute(new Subscriber(this, queueName, handler)); 
} 

//... 

private ExecutorService es_; 

Ứng dụng có thể đăng ký nhiều thuê bao như bạn muốn. Bây giờ tôi muốn thực hiện một cái gì đó như Unsubscribe vì vậy mỗi thuê bao có khả năng ngăn chặn luồng thông điệp. Ở đây tôi cần một cách để ngăn chặn một trong các nhiệm vụ đang chạy trong ExecutorService. Nhưng tôi không biết làm thế nào tôi có thể làm điều này.

ExecutorService.shutdown() và các biến thể của nó không dành cho tôi: chúng chấm dứt tất cả các tác vụ, tôi chỉ muốn chấm dứt một trong số chúng. Tôi đang tìm kiếm một giải pháp. Đơn giản nhất có thể. Cảm ơn.

Trả lời

8

Bạn có thể sử dụng ExecutorService#submit thay vì execute và sử dụng trở Future đối tượng để thử và hủy nhiệm vụ sử dụng Future#cancel

Ví dụ (Giả sử Subscriber là một Runnable):

Future<?> future = es_.submit(new Subscriber(this, queueName, handler)); 
... 
future.cancel(true); // true to interrupt if running 

Lưu ý quan trọng từ các nhận xét:

If your task doesn't honour interrupts and it has already started, it will run to completion.

+0

Sẽ hữu ích nếu bạn chỉnh sửa câu trả lời của mình để thêm ví dụ đơn giản. Tôi có thể tìm thấy tất cả những thứ trong tài liệu và google, nhưng câu trả lời không chỉ dành cho tôi mà còn cho những người khác nữa. Điều này có thể tiết kiệm thời gian (vô giá). – maverik

+0

Ở đây bạn đi, ví dụ đơn giản –

+0

Cảm ơn. Điều này thực sự hữu ích. – maverik

3

Thay vì sử dụng ExecutorService.execute(Runnable), hãy thử sử dụng Future<?> submit(Runnable). Phương thức này sẽ gửi Runnable vào hồ bơi để thực thi và nó sẽ trả về đối tượng Future. Bằng cách này, bạn sẽ có tham chiếu đến tất cả các chủ đề thuê bao.

Để dừng chuỗi cụ thể chỉ cần sử dụng futureObj.cancel(true). Điều này sẽ làm gián đoạn chuỗi đang chạy, ném một số InterruptedException. Chủ đề của người đăng ký phải được mã hóa theo cách đó, nó sẽ ngừng xử lý trong trường hợp ngoại lệ này (ví dụ: Thread.sleep(millis) với khối try/catch bao bọc cho toàn bộ phương thức).

Bạn CAND tìm thêm thông tin về API chính thức: http://docs.oracle.com/javase/6/docs/api/java/util/concurrent/Future.html http://docs.oracle.com/javase/6/docs/api/java/util/concurrent/ExecutorService.html