是否可以在Stream.parallel()中设置线程的优先级?

Ste*_*ier 11 java java-8 java-stream java-threads

如果我想在后台任务中并行运行Stream,是否可以以较低优先级运行它?如果是这样怎么样?

Ste*_*n C 9

对的,这是可能的.

程序如下:

  1. 创建一个ForkJoinWorkerThreadFactory创建具有适当优先级的线程.

  2. ForkJoinPool使用上面的线程工厂创建一个.

  3. 实例化并行流.

  4. 通过将流提交到.来运行流 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();
Run Code Online (Sandbox Code Playgroud)

(示例代码改编http://www.baeldung.com/java-8-parallel-streams-custom-threadpool)

  • 第二个问题可能是(除非你在Java 10上),所创建的fork连接任务的数量将与[common pool parallelism]成比例(https://bugs.openjdk.java.net/browse/JDK- 8190974) (3认同)
  • 需要注意的是,这种行为是一个未记录的实现细节,就像Fork/Join池的整个使用一样.没有保证这在其他实现中有效. (2认同)