Order guarantees using streams and reducing chain of consumers

前端 未结 2 745
悲&欢浪女
悲&欢浪女 2021-01-05 16:41

So as it goes in the current scenario, we have a set of APIs as listed below:

Consumer start();
Consumer performDailyAggregates();
Consumer         


        
2条回答
  •  再見小時候
    2021-01-05 17:42

    Even if the Stream> is made parallel, the resulting compound Consumer will execute the individual consumers in order, assuming:

    • The Stream is ordered.
      A stream sourced by a List is ordered, even with parallel enabled.

    • The accumulator passed to reduce() is associative.
      Consumer::andThen is associative.

    Let's say you have a list of 4 consumers [A, B, C, D]. Normally, without parallel, the following would happen:

    x = A.andThen(B);
    x = x.andThen(C);
    compound = x.andThen(D);
    

    so that calling compound.apply() would call A, B, C, then D in that order.

    If you enable parallel, the stream framework might instead split that to be processed by 2 threads, [A, B] by thread 1, and [C, D] by thread 2.

    That means the following will happen:

    x = A.andThen(B);
    y = C.andThen(D);
    compound = x.andThen(y);
    

    The result is that x is applied first, which means A then B, then y is applied, which means C then D.

    So although the compound consumer is built like [[A, B], [C, D]] instead of the left-associative [[[A, B], C], D], the 4 consumers are executed in order, all because Consumer::andThen is associative.

提交回复
热议问题