Streams - parallel
Concurrent moddification of collection
wypisywac nazwy wątków
List<String> l = new ArrayList(Arrays.asList("one", "two"));
Stream<String> sl = l.stream();
l.add("three");
String s = sl.collect(joining(" "));
- konfiguracja streamu przez enumy
- explicitly de-ordering the stream with unordered() may improve parallel performance for some stateful or terminal operations
reduce(new StringCombiner(", ", "[", "]"),
StringCombiner::add,
StringCombiner::merge
public class StringCollector implements Collector<String, StringCombiner, String> {
public Supplier<StringCombiner> supplier() {
return () -> new StringCombiner(delim, prefix, suffix);
}
}
- reduce - immutable (identity concept, monoid!!)
- proper identity ""
- wrong identity "aaa"
- collect - mutable
- reduce ze StringBuilderem
Stream.parallel().sequential() - last wins
L1
- przykład z tym jak modyfikacja AtomicInt wpływa na spowolnienie obliczęń równoległych.
- przygotowac specjalną metode do mierzenia czasu z voaltile.
- spliterator
txns.parallelStream()
.unordered()
StreamSupport(SpliteratorsUnknownSize.spliteratorUnknownSize(iterators))
Default fork join pool
http://stackoverflow.com/questions/21163108/custom-thread-pool-in-java-8-parallel-stream
forkJoin.submit(
i tutaj operacje na strumieniu z wypisywaniem wątku
)
//puscic dwa streamy na razy na common pool
// co się dzieje z pulą wątków gdy sa zagnieżdzone streamy??
- i main-thread też tam pracuje!!!!
Concurrent collectors
ConcurrentMap<Person.Sex, List<Person>> byGender =
roster
.parallelStream()
.collect(
Collectors.groupingByConcurrent(Person::getGender));
- BaseStream.unordered
- Collectors.toConcurrentMap
- -Djava.util.concurrent.ForkJoinPool.common.parallelism=1,
rodzaje kolekcji
- najlepiej ArrayList bo łatwo można podzielić
- gorzej LinkedList
- dlaczego Stream.iterate bardzo źle się dzieli na wątki :)
Long accumulator
http://www.nurkiewicz.com/2015/06/how-longaccumulator-and.html
Array
- parallel sort