SORU
16 Ocak 2014, PERŞEMBE


Ö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
8 Mart 2014, CUMARTESİ


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()"

Bunu Paylaş:
  • Google+
  • E-Posta
Etiketler:

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • Metheud

    Metheud

    9 EYLÜL 2006
  • NextGenWindows

    NextGenWindo

    8 Kasım 2011
  • Trulia

    Trulia

    29 Kasım 2006

İLGİLİ SORU / CEVAPLAR