Пул потоков Java ForkJoinPool необъяснимым образом прекратит работуJAVA

Программисты JAVA общаются здесь
Ответить
Anonymous
 Пул потоков Java ForkJoinPool необъяснимым образом прекратит работу

Сообщение Anonymous »

Почему мой код необъяснимым образом прерывает выполнение, когда я использую пул потоков ForkJoinPool по умолчанию, но я не сталкиваюсь с этой проблемой при использовании пользовательского пула потоков ExecutorService
Пример ForkJoinPool по умолчанию

Код: Выделить всё

List lists = new ArrayList();
for (int i = 0; i < 10; i++) {
CompletableFuture future = CompletableFuture.supplyAsync(() -> {
List list = new ArrayList(1000);
for (int j = 0; j < 1000; j++) {
list.add("test" + j);
System.out.println(Thread.currentThread().getName() + " " + j);
}
return list;
});
lists.add(future);
}
CompletableFuture allFuture = CompletableFuture.allOf(lists.toArray(new CompletableFuture[0]));
allFuture.thenRun(() -> {
System.out.println("done");
});
Используйте пользовательские службы ExecutorService

Код: Выделить всё

int threadNum = Runtime.getRuntime().availableProcessors() * 2;
ExecutorService executorService = new ThreadPoolExecutor(threadNum, threadNum, 0L, TimeUnit.MILLISECONDS,
new LinkedBlockingQueue(10), new ThreadPoolExecutor.CallerRunsPolicy());
List lists = new ArrayList();
for (int i = 0; i < 10; i++) {
CompletableFuture future = CompletableFuture.supplyAsync(() -> {
List list = new ArrayList(1000);
for (int j = 0; j < 1000; j++) {
list.add("test" + j);
System.out.println(Thread.currentThread().getName() + " " + j);
}
return list;
},executorService);
lists.add(future);
}
CompletableFuture allFuture = CompletableFuture.allOf(lists.toArray(new CompletableFuture[0]));
allFuture.thenRun(() -> {
System.out.println("done");
});
Когда я пытался использовать CompletableFuture для пакетного получения, анализа сжатых пакетов и выполнения бизнес-операций, не было никаких проблем, когда объем данных был в пределах 100. Однако, когда объем данных был 88, мой программа завершилась в неизвестной ситуации; Я пытаюсь воспроизвести онлайн-проблему, используя локальный практический пример; Сначала я попробовал использовать метод join(), и он действительно оказался успешным без завершения; Но позже я обнаружил, что если я использую собственный пул потоков, ему вообще нельзя работать с методом join(). Меня очень смущает то, как ForkJoinPool работает на нижнем уровне; Почему произошли такие различия; Я понимаю, что я не использовал метод Join(), метод основного потока выполнялся напрямую; Не жду моей подтемы; Но я использовал пул потоков, и у меня не было этой проблемы. Почему это?

Подробнее здесь: https://stackoverflow.com/questions/791 ... te-running
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «JAVA»