Можно ли установить приоритет потоков в Stream.parallel()?

Если я хочу запустить Stream параллельно в фоновом задании, можно ли запустить его в более низком приоритете? И если да, то как?

Ответ 1

Да, это возможно.

Процедура такова:

  • Создайте ForkJoinWorkerThreadFactory, который создает потоки с соответствующим приоритетом.

  • Создайте ForkJoinPool, используя указанный выше поток factory.

  • Создайте параллельный поток.

  • Запустите поток, отправив его в ForkJoinPool

Что-то вроде этого:

public class MyThread extends ForkJoinWorkerThread {
    public MyThread(ForkJoinPool pool, int priority) {
        super(pool);
        setPriority(priority);
    }
}

final int poolSize = ...
final int priority = ...

List<Long> aList = LongStream.rangeClosed(firstNum, lastNum).boxed()
  .collect(Collectors.toList());

ForkJoinWorkerThreadFactory factory = new ForkJoinWorkerThreadFactory() {
    public ForkJoinWorkerThread newThread(ForkJoinPool pool) {
         return new MyThread(pool, priority);
    }
};
/*
ForkJoinWorkerThreadFactory factory = pool -> new MyThread(
  pool,
  priority
);
*/

ForkJoinPool customThreadPool = new ForkJoinPool(
    poolSize, factory, null, false);
long actualTotal = customThreadPool.submit(
    () -> aList.parallelStream().reduce(0L, Long::sum)).get();

(Пример кода, адаптированный из http://www.baeldung.com/java-8-parallel-streams-custom-threadpool)