2016-04-04 32 views
4

Uygulamamda, bazı küçük duraklamalar ile kalıcı olarak çalışan 4 farklı işlem var.Çoklu newSingleThreadExecutor ve newFixedThreadHavuz ExecutionService

kodunun güncel sürümü ayrı bir eski okul dizisindeki her işlemi gerçekleştirir:

Thread nlpAnalyzer = new Thread(() -> { 

    // infine lop for auto restore in case of crash 
    //noinspection InfiniteLoopStatement 
    while (true) { 
     try { 
      // this method should run permanently, pauses implemented internally 
      NLPAnalyzer.analyzeNLP(dbCollection); 
     } catch (Exception e) { 
      e.printStackTrace(); 
     } 
    } 
}); 

nlpAnalyzer.setName("im_nlpAnalyzer"); 
nlpAnalyzer.start(); 

Şimdi ExecutorService kullanımı ile bu kodu refactor istiyorum. Bunu yapmak için en az iki yaklaşım kullanabilirim:

  • newFixedThreadPool(numOfProc);
  • numOfProc * newSingleThreadExecutor().

Sorularım:

  1. ben başka bir yere bir seçeneği tercih etmelidir için bir sebep var mı?
  2. X iş parçacıklı bir iş parçacığı havuzu oluşturmak veya X newSingleThreadExecutor oluşturmak için daha ne kabul edilir?
  3. Her bir yaklaşımın karşıtı mı? Her görevin Verilen
+0

Seçeneği. – Spotted

+0

Başka bir notta, kodu, infinite döngü içinde, çalıştırıldığında kendini executor hizmeti olarak yeniden gönderen bir 'Runnable' olarak yeniden yazabilirsiniz. Bu şekilde, birden çok görev tek bir iş parçacığında bile çalışabilir. –

cevap

2

bir sonsuz döngü, ne kullanılan ediyorum olan bu (artık ve)

yararı gerekli her görev için bir iş parçacığı yaratacak

newCachedThreadPool(); 

bir Tek bir dişli havuz kullanarak her bir havuzu ayrı ayrı kapatabilir veya her bir iş parçacığına bir ad verebilir, ancak buna ihtiyacınız yoksa, sadece havai.

Not: hata ayıklama/profilleme amaçlar için yararlı olabilir SetName içeren ileti adını ("Benim görevim") değiştirebilirsiniz.

Bir ExecutorService kullanmanın hilelerinden biri, yakalanmamış herhangi bir istisna/hata yakalaması ve döndürülen Future nesnesine yerleştirmesidir. Çoğu zaman bu Future atılır, yani göreviniz beklenmedik bir şekilde ölürse sessizce de yapılabilir.

Sana döngü dışında bir try/catch (Atılabil) yapmak ve iplik hiç beklenmedik ölürse Gördüğünüz öyle log düşündürmektedir. Örnek: OutOfMemoryError

+0

Bildiğim kadarıyla, yalnızca "newSingleThreadExecutor" ile değil, "newFixedThreadPool" içine bile ayrı bir iş parçacığı atayabilirim. X thread veya X 'newSingleThreadExecutor's için 1' newFixedThreadPool' arasında bir performans farkı var mı? –

+1

@MikeB. Ayrı bir iş parçacığı adı atayabilir, ancak görevin amacına göre daha kullanışlı olabilecek bir tane atamazsınız. Daha net hissettiğiniz her şeyi yapardım, hangi çözümü seçerseniz seçin, bir "Thread" hala işi yapar. –

1

Tek tek yürütücüyü kapatmak dışında aşağıdaki seçeneklerden herhangi bir fayda göremiyorum.

numOfProc * newSingleThreadExecutor() 

Ancak daha fazla seçeneğiniz var. Aşağıdaki seçeneklerden birini tercih ediyorum: Executors.

newFixedThreadPool 
newCachedThreadPool 
newWorkStealingPool 

alakalı sorgu için GD sorulara aşağıda bakınız: 1 daha yaygındır ve en az yüke sahiptir

Java's Fork/Join vs ExecutorService - when to use which?

How to properly use Java Executor?

Difference between Executors.newFixedThreadPool(1) and Executors.newSingleThreadExecutor()