2012-04-06 36 views
8

Tôi tạo một ThreadPool với 10 chủ đề cố định trong đó. Đôi khi tôi cần phải làm gián đoạn một chuỗi dài trong hồ bơi chủ đề, chủ yếu là vì họ đang chặn trong một số hoạt động và một thời gian chờ xảy ra và tôi làm gián đoạn sợi. Tôi bắt các InterruptedException và thiết lập trạng thái của Thread để ngắt. Trong trường hợp đó, câu hỏi của tôi là, không ThreadPool tạo một Chủ đề mới và thay thế chuỗi bị gián đoạn bằng một chuỗi mới? Dưới đây là mã ví dụ được thực hiện bởi Chủ đề. Câu hỏi là, khi thread này bị gián đoạn, không thread thread thay thế thread này với một cái mới?cách trình xử lý tác vụ của hồ bơi thực thi java với chủ đề bị gián đoạn

public ResponseMessage call(){ 
    Future<ResponseMessage> future = CacheManager.getInstance().asyncFetch(); 
    ResponseMessage response = null; 
    try { 
     response = future.get(); 
    } 
    catch (InterruptedException e) { 
     Thread.currentThread().interrupt(); 
    } catch (ExecutionException ex) { 
     //create a blank response 
    } 

    return response; 
} 
+2

loại threadpool bạn đang sử dụng? – dash1e

+1

Bạn biết rằng 'get()' có quá tải chấp nhận hết thời gian, phải không? – erickson

+0

'StopWatch' làm gì? – erickson

Trả lời

7

Bạn không được làm gián đoạn các chủ đề mà bạn không "sở hữu" bởi vì bạn không biết cách chúng phản hồi. Vì bạn không có quyền kiểm soát lịch trình chuỗi, bạn thực sự không biết rằng một chuỗi nhất định đang thực hiện một tác vụ cụ thể ngay lập tức bạn ngắt nó

Nếu bạn muốn hủy tác vụ bạn đã cho dịch vụ, gọi số cancel(true) trên số điện thoại Future được liên kết. Khi tác vụ của bạn phát hiện một yêu cầu ngắt, nó sẽ giữ nguyên trạng thái bị gián đoạn bằng cách gọi Thread.currentThread().interrupt().

Nếu bạn làm điều này, người thực thi sẽ xử lý gián đoạn một cách sạch sẽ vì nó bị gián đoạn chính luồng và biết rằng luồng đang thực hiện tác vụ khi xảy ra gián đoạn.

+0

Tôi đang theo dõi chính xác như bạn đã đề cập, tôi hủy tương lai và trong chuỗi callee, tôi giữ nguyên trạng thái gián đoạn. – Shamik

+1

@Shamik Tôi không thấy bất kỳ lệnh gọi nào tới 'cancel()' trong mã của bạn. – erickson

+0

Có một người gọi mã trên, gửi nhiệm vụ có thể gọi này đến hồ bơi chuỗi và hủy nhiệm vụ bằng cách sử dụng future.cancel (true) – Shamik

0

Từ từng bước gỡ lỗi, tôi cho rằng chuỗi bị gián đoạn sẽ tiếp tục getTask từ hàng đợi công nhân. Trạng thái bị gián đoạn đã được dọn sạch trước getTask.

Ví dụ, nếu bạn đang sử dụng FixedThreadPool với LinkedBlockingQueue, tình trạng gián đoạn được làm sạch bên trong queue.take() bởi ReentrantLock.lockInterruptibly()

public final void acquireInterruptibly(int arg) throws InterruptedException { 
    if (**Thread.interrupted()**) 
     throw new InterruptedException(); 
    if (!tryAcquire(arg)) 
     doAcquireInterruptibly(arg); 
} 
Các vấn đề liên quan