2009-10-13 24 views
21

Tôi đang làm việc trên các Executors trong java để chạy đồng thời nhiều luồng hơn tại một thời điểm. Tôi có một tập hợp các đối tượng Runnable và tôi gán nó cho Exceutors.The Executor đang làm việc tốt và mọi thứ đều ổn. Nhưng sau khi tất cả các nhiệm vụ được thực hiện trong hồ bơi, chương trình java không bị chấm dứt, tôi nghĩ rằng Executor mất một thời gian để giết các threads.please bất cứ ai giúp tôi để giảm thời gian thực hiện bởi các nhà điều hành sau khi thực hiện tất cả các nhiệm vụ.Làm thế nào để ngăn chặn việc thực thi Executor ThreadPool trong java?

Trả lời

22

Lớp ExecutorService có 2 phương pháp chỉ cho điều này: shutdown()shutdownNow().

Sau khi sử dụng phương pháp tắt(), bạn có thể gọi awaitTermination() để chặn cho đến khi tất cả các tác vụ bắt đầu đã hoàn thành. Bạn thậm chí có thể cung cấp một thời gian chờ để ngăn chặn chờ đợi mãi mãi.

Bạn có thể muốn nhấp vào một số liên kết mà tôi đang cung cấp. Họ đi thẳng đến các tài liệu mà bạn có thể tự mình đọc về nội dung này.

+0

Làm thế nào tôi có thể đảm bảo rằng tất cả các nhiệm vụ được cam kết, tôi cần tất cả các nhiệm vụ phải cam kết thực hiện – Rajapandian

+1

@Rajapandian Định nghĩa tắt máy là chờ đợi cho tất cả các nhiệm vụ hoàn thành, nhưng không cho phép bắt đầu. Làm thế nào mà không làm những gì bạn muốn? –

+1

vui lòng bất kỳ ai cho tôi biết lý do tại sao chương trình java của tôi mất thời gian để ngừng thực thi ngay cả sau khi Người thực thi hoàn thành tất cả nhiệm vụ của nó. – Rajapandian

9

executor.shutdown() với awaitTermination (timeout) không giết chuỗi. (nghĩa là), nếu nhiệm vụ runnable của bạn nằm trong vòng lặp bỏ phiếu, nó sẽ không giết nhiệm vụ. Tất cả những gì nó làm là làm gián đoạn các tác vụ runnable của nó khi hết thời gian chờ. Vì vậy, trong các mã cho lớp Runnable của bạn, nếu bạn chờ đợi trên một số điều kiện, bạn có thể muốn thay đổi điều kiện như,

while (flagcondition && !Thread.currentThread().isInterrupted()) {} 

Điều này đảm bảo rằng nhiệm vụ dừng lại khi sợi bị gián đoạn như vòng lặp while chấm dứt. Cách khác, bạn có thể muốn bắt ngoại lệ bị gián đoạn và đặt cờ = false trong khối catch để chấm dứt chuỗi.

try { 
    // do some stuff and perform a wait that might throw an InterruptedException 
} catch (InterruptedException e) { 
    flagcondition = false; 
} 

Bạn cũng có thể muốn sử dụng profiler để kiểm tra lý do tại sao một số chủ đề chưa được hoàn thành.