javajava-8java-streamjava-threads

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


If I want to run a Stream in parallel in a background task is it possible to run it in lower priority? And if so how?


Solution

  • Yes it is possible.

    The procedure is as follows:

    1. Create a ForkJoinWorkerThreadFactory that creates threads with an appropriate priority.

    2. Create a ForkJoinPool using the above thread factory.

    3. Instantiate the parallel stream.

    4. Run the stream by submitting it to the ForkJoinPool

    Something like this:

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

    (Example code adapted from http://www.baeldung.com/java-8-parallel-streams-custom-threadpool)