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

最佳答案

是的,有可能。

步骤如下:

  • 创建一个ForkJoinWorkerThreadFactory,该代码创建具有适当优先级的线程。
  • 使用上述线程工厂创建ForkJoinPool
  • 实例化并行流。
  • 通过将流提交到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)

    10-07 18:48
    查看更多