ExecutorService FixedThreadPool в качестве общего параметра не работает параллельно - PullRequest
0 голосов
/ 21 ноября 2018

Я пытаюсь использовать фиксированный пул потоков в Java 8, который прекрасно работает, пока он остается в той же функции.Как только я пытаюсь поделиться исполнителем в качестве параметра, он никогда не запускается параллельно.

Это прекрасно работает:

`` `

public static void test2() {

ExecutorService executor =  Executors.newFixedThreadPool(2);
try {
    CompletionService<Integer> myCompletionService = 
               new ExecutorCompletionService<Integer>(executor);


    myCompletionService.submit(()-> {
        try {
            TimeUnit.SECONDS.sleep(5);
            return 123;
        }
        catch (InterruptedException e) {
            throw new IllegalStateException("task interrupted", e);
        }
    });


    CompletionService<Integer> myCompletionService2 = 
               new ExecutorCompletionService<Integer>(executor);
    myCompletionService2.submit(()-> {
        try {
            TimeUnit.SECONDS.sleep(5);
            return 654;
        }
        catch (InterruptedException e) {
            throw new IllegalStateException("task interrupted", e);
        }
    });

    Future<Integer> myFuture = myCompletionService.take();
    Integer x = myFuture.get();
    System.out.println("Result = " + x);

    Future<Integer> myFuture2 = myCompletionService2.take();
    Integer y = myFuture2.get();
    System.out.println("Result = " + y);

    executor.shutdown();
} catch (InterruptedException | ExecutionException e1) {
    // TODO Auto-generated catch block
    e1.printStackTrace();
}
}
```

Но как только я переместу их в три функции, такие как:

` ``

static Integer t1(ExecutorService executor) throws InterruptedException, ExecutionException {
    CompletionService<Integer> myCompletionService = 
               new ExecutorCompletionService<Integer>(executor);


    myCompletionService.submit(()-> {
        try {
            TimeUnit.SECONDS.sleep(5);
            return 123;
        }
        catch (InterruptedException e) {
            throw new IllegalStateException("task interrupted", e);
        }
    });
    Future<Integer> myFuture = myCompletionService.take();
    return myFuture.get();
}

static Integer t2(ExecutorService executor) throws InterruptedException, ExecutionException {
    CompletionService<Integer> myCompletionService2 = 
               new ExecutorCompletionService<Integer>(executor);


    myCompletionService2.submit(()-> {
        try {
            TimeUnit.SECONDS.sleep(5);
            return 456;
        }
        catch (InterruptedException e) {
            throw new IllegalStateException("task interrupted", e);
        }
    });
    Future<Integer> myFuture2 = myCompletionService2.take();
    return myFuture2.get();
}

static void test3() {
    ExecutorService executor =  Executors.newFixedThreadPool(5);
    try {
        Integer x = t1(executor);
        Integer y = t2(executor);
    } catch (InterruptedException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    } catch (ExecutionException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }
    executor.shutdown();
}

`` `Теперь test3 займет 10 секунд, где я ожидал, что он будет таким же, как верхний, который должен занять 5 секунд, если все работает параллельно.,

1 Ответ

0 голосов
/ 21 ноября 2018

В t1 после отправки вы вызываете get () и получаете блокировку, поэтому вы выходите из t1 только после завершения первой задачи (через 5 секунд).

В первом примере вы отправляете обе задачи, чтобы они запускалисьвыполняется в отдельных потоках, а затем вызывается только get () для блокировки и ожидания результата.

...