2012-07-11 39 views
9

Tôi đang cố triển khai ứng dụng mẫu để kiểm tra các giao diện CallableExecutorService.Làm thế nào để dừng một cuộc gọi được gửi đến ExecutorService?

Trong ứng dụng của tôi, tôi đã tuyên bố:

ExecutorService exSvc = Executors.newSingleThreadExecutor(); 

Sau đó:

Future<Integer> test = exSvc.submit(
    new Callable<Integer>() { 
     public Integer call() { 
      for(int i = 0; i < 1000; i++){ 
       System.out.println(i); 
      } 
      return 1; 
     } 
    }); 

Bây giờ tôi đang cố gắng để ngăn chặn quá trình này trước khi nó kết thúc, tôi đang sử dụng exSvc.shutdownNow() nhưng nó không công việc.

Để dừng duyên dáng cổ điển Thread Tôi thường sử dụng một số loại biến số điều kiện. Cách tiếp cận phổ biến nào để theo dõi với ExecutorService?

Trả lời

16

Future.cancel(true)ExecutorService.shutdownNow() sử dụng ngắt chuỗi. Chừng nào bạn không thực hiện cuộc gọi chặn uninterruptable trong nhiệm vụ của bạn, bạn chỉ cần có để xử lý tình trạng gián đoạn một cách chính xác, một cái gì đó như thế này:

for(int i = 0; i < 1000; i++){ 
    // Uses isInterrupted() to keep interrupted status set 
    if (Thread.currentThread().isInterrupted()) { 
     // Cannot use InterruptedException since it's checked 
     throw new RuntimeException(); 
    } 
    System.out.println(i); 
} 

Nếu bạn thực hiện cuộc gọi chặn uninterruptable (như mạng IO), mọi thứ trở nên phức tạp hơn, bạn cần phải ngắt chúng bằng tay bằng cách nào đó, ví dụ, bằng cách đóng các ổ cắm bên dưới.

+0

Có cách nào để dừng quy trình mà không sử dụng gián đoạn luồng không? – davioooh

+0

Nó không rõ ràng chính xác những gì bạn muốn. 'shutdownNow()' đã sử dụng gián đoạn. – axtavt

+0

Có, tôi đang yêu cầu làm thế nào để ngăn chặn nó ** mà không có ** thread gián đoạn. Sử dụng 'shutdownNow()' là cách duy nhất để dừng một luồng được gửi tới một 'ExecutorService'? – davioooh

3

Đây là cách tôi làm điều đó với một số FixedThreadPool, hy vọng đó là một số trợ giúp.

ExecutorService pool = Executors.newFixedThreadPool(Runtime.getRuntime().availableProcessors()); 

    List<Future<Void>> results = new ArrayList<>(); 

    for (int i = 0; i < numberOfJobs; i++) { 
     MyCallableJob job = new MyCallableJob (...); 
     results.add(pool.submit(job)); 
    } 

    for (Future<Void> result : results) { 
     try { result.get(); } 
     catch (InterruptedException | ExecutionException ignorable) { } 
    } 

    pool.shutdown(); 
Các vấn đề liên quan