Jeśli chcę uruchomić strumień równolegle w zadaniu tła, czy można go uruchomić z niższym priorytetem? A jeśli tak, to w jaki sposób?Czy można ustawić priorytet wątków w Stream.parallel()?
10
A
Odpowiedz
8
Tak, jest to możliwe.
Procedura jest następująca:
Tworzenie
ForkJoinWorkerThreadFactory
który tworzy wątki z odpowiednim priorytetem.Utwórz
ForkJoinPool
przy użyciu powyższej fabryki nici.Wywołaj równoległy strumień.
Uruchom strumienia przez złożenie go do
ForkJoinPool
tak:
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();
(przykład kod dostosowany z http://www.baeldung.com/java-8-parallel-streams-custom-threadpool)
'nowy ForkJoinWorkerThread()' nie kompiluje się. – shmosel
Powiedziałem "coś w stylu" :-) Potrzebował argumentu "pool". –
Nadal się nie kompiluje. Myślę, że musisz ją podklasować. – shmosel