Если я хочу запустить Stream параллельно в фоновом задании, можно ли запустить его в более низком приоритете? И если да, то как?
Можно ли установить приоритет потоков в Stream.parallel()?
Ответ 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)