2009-10-13 5 views
21

Aynı anda birden fazla iş parçacığı çalıştırmak için java'daki Yürütücüler üzerinde çalışıyorum. Bir dizi Runnable Nesnesi var ve onu Exceutors'a atadım.Yükleyici çalışıyor ve her şey yolunda. Ama tüm görevler havuzda yürütüldükten sonra, java programı sonlandırılmıyor, Executor düşünüyorum iş parçacığı öldürmek için biraz zaman alır. Herkes, tüm görevleri yerine getirdikten sonra yürütücünün aldığı süreyi azaltmam için bana yardımcı olur.Java'da Executor ThreadPool'un yürütülmesi nasıl durdurulur?

cevap

22

ExecutorService sınıfının bunun için 2 yöntemi vardır: shutdown() ve shutdownNow().

shutdown() yöntemini kullandıktan sonra, başlatılan tüm görevler tamamlanana kadar engellemek için awaitTermination() numaralı telefonu arayabilirsiniz. Sonsuza kadar beklemeyi önlemek için bir zaman aşımı bile sağlayabilirsiniz.

Sağladığım bu bağlantılardan bazılarını tıklatmak isteyebilirsiniz. Bu şeyleri kendin okuyabileceğin dokümanlar için doğruca giderler.

+0

Tüm görevlerin yerine getirildiğinden nasıl emin olabilirim, tüm görevleri yürütme işlemini yerine getirmeliyim. – Rajapandian

+1

@Rajapandian Kapanma tanımı, tüm görevlerin tamamlanmasını bekler, ancak yenilerinin başlatılmasına izin vermez. Bu senin istediğin şeyi yapmıyor mu? –

+1

herhangi biri lütfen, java programımın, tüm görevini bitirdikten sonra bile yürütmeyi durdurması için zaman aldığını söyleyin. – Rajapandian

9

executor.shutdown() ile birlikte bekleyinTerminasyon (zaman aşımı) iş parçacığını öldürmez. (yani) eğer runnable göreviniz bir yoklama döngüsü içinde ise, görevi öldürmez. Tek yaptığı zaman aşımı olduğunda, çalıştırılabilir görevlerini kesmektir. Bazı şartla beklerseniz Yani, sizin katedilebilen sınıf için kodunda, sen Bu while döngüsü sona kadar iplik kesildiğinde görev durmasını sağlar

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

olarak koşulunu değiştirmek isteyebilirsiniz. Alternatif olarak, kesintili istisnayı yakalamak ve ipliği sonlandırmak için catch bloğuna flag = false değerini ayarlamak isteyebilirsiniz.

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

Ayrıca bazı ipler tamamlanana kadar devam değil nedenlerini incelemek için bir profil oluşturucu kullanmak isteyebilirsiniz.