簡體   English   中英

是否可以在Stream.parallel()中設置線程的優先級?

[英]Is it possible to set the priority of the threads in Stream.parallel()?

如果我想在后台任務中並行運行Stream,是否可以以較低優先級運行它? 如果是這樣怎么樣?

對的,這是可能的。

程序如下:

  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();

(示例代碼改編http://www.baeldung.com/java-8-parallel-streams-custom-threadpool

我認為更好的方法就像這里描述的那樣:

public class CustomForkJoinWorkerThreadFactory implements ForkJoinWorkerThreadFactory {

    private final int threadPriority;

    public CustomForkJoinWorkerThreadFactory(int threadPriority) {
        this.threadPriority = threadPriority;
    }

    @Override           
    public ForkJoinWorkerThread newThread(ForkJoinPool pool)
    {
        final ForkJoinWorkerThread worker = ForkJoinPool.defaultForkJoinWorkerThreadFactory.newThread(pool);
        worker.setPriority(threadPriority);
        return worker;
    }
}

它允許你仍然使用“默認”ForkJoinWorkerThread,但你可以設置優先級/名稱/等。使用如下:

new ForkJoinPool(poolSize, new CustomForkJoinWorkerThreadFactory(Thread.MIN_PRIORITY), null, false);

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM