Java 8 paralel akışı için özel bir iş parçacığı havuzu belirtmek mümkün mü ? Hiçbir yerde bulamadım.
Bir sunucu uygulamam olduğunu ve paralel akışlar kullanmak istediğimizi düşünün. Ancak uygulama büyük ve çok iş parçacıklı olduğundan, bölümlere ayırmak istiyorum. Başka bir modülün applicationblock görevlerinin bir modülünde yavaş çalışan bir görev istemiyorum.
Farklı modüller için farklı iş parçacığı havuzları kullanamıyorsam, gerçek dünyadaki durumların çoğunda paralel akışları güvenle kullanamayacağım anlamına gelir.
Aşağıdaki örneği deneyin. Ayrı iş parçacıklarında yürütülen bazı CPU yoğun görevleri vardır. Görevler paralel akışlardan yararlanır. İlk görev bozulur, bu nedenle her adım 1 saniye sürer (iplik uyku ile simüle edilir). Sorun, diğer iş parçacıklarının takılması ve kırık görevin bitmesini beklemesidir. Bu bir örnek, ancak bir sunucu uygulaması ve paylaşılan çatal birleştirme havuzuna uzun süredir çalışan bir görev gönderen birini hayal edin.
public class ParallelTest {
public static void main(String[] args) throws InterruptedException {
ExecutorService es = Executors.newCachedThreadPool();
es.execute(() -> runTask(1000)); //incorrect task
es.execute(() -> runTask(0));
es.execute(() -> runTask(0));
es.execute(() -> runTask(0));
es.execute(() -> runTask(0));
es.execute(() -> runTask(0));
es.shutdown();
es.awaitTermination(60, TimeUnit.SECONDS);
}
private static void runTask(int delay) {
range(1, 1_000_000).parallel().filter(ParallelTest::isPrime).peek(i -> Utils.sleep(delay)).max()
.ifPresent(max -> System.out.println(Thread.currentThread() + " " + max));
}
public static boolean isPrime(long n) {
return n > 1 && rangeClosed(2, (long) sqrt(n)).noneMatch(divisor -> n % divisor == 0);
}
}