Özel iplik Java 8'de paralel akış havuzu
8 parallel stream Java için özel bir iş parçacığı havuzu belirtmek mümkün mü? Hiçbir yerde bulamıyorum.
Server bir uygulama var ve paralel akışları kullanmak istiyorum düşünün. Ama uygulamayı bölümlere ayırmak istiyorum, çok büyük ve çok iş parçacıklı. Başka bir modül applicationblock görevlerinden biri modülünde yavaş çalışan bir görev istemiyorum.
Eğer farklı modüller için farklı bir iş parçacığı havuzu kullanın miyim değil, güvenli bir şekilde gerçek dünya durumlarda en çok paralel akarsu kullanabileceğim anlamına geliyor.
Aşağıdaki örneği deneyin. Bazı İŞLEMCİ yoğun görevler ayrı bir iş parçacığı yürütülür. Görevler kaldıraç paralel sürdürülecek. İlk görev kırılmış, her adım ikinci 1 (iş parçacığı uyku ile simüle) alır. Sorunu başka bir iş parçacığı kalmış ve kırık görevi tamamlamak için bekleyin. Bu yapmacık örnektir, ama sunucu uygulaması ve bir kişinin paylaştığı çatal katılın havuza uzun süren bir görev gönderme düşünün.
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);
}
}
CEVAP
Aslında çatal-katılmak özel bir havuzu paralel bir çalışma yürütmek için nasıl bir hile var. Eğer çatal-katıl havuzda bir görev olarak yürütmek, orada kalır ve ortak bir kullanmaz.
ForkJoinPool forkJoinPool = new ForkJoinPool(2);
forkJoinPool.submit(() ->
//parallel task here, for example
IntStream.range(1, 1_000_000).parallel().filter(PrimesPrint::isPrime).collect(toList())
).get();
Belirtir hile ForkJoinTask.fork dayanır: "zaman uyumsuz olarak Geçerli görevi çalıştığı havuzda bu görevi yürütmek varsa, ya ForkJoinPool kullanarak Düzenler.() commonPool değilse inForkJoinPool()"