Я пытаюсь использовать фиксированный пул потоков в 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 секунд, если все работает параллельно.,