Stream parallel() / sequential() question.
Boaz Nahum
boaznahum at gmail.com
Thu Apr 4 07:49:06 PDT 2013
Suppose I wrote a method:
<T> Stream<T> foo(Stream<T> source ) {
return s.sequential().map(nonThreadSafeMapper);
}
I which I used a non-thread-safe-mapper. To protect my self I
'sequential()' it.
Now, somewhere else somebody:
foo().parallel() ....
So, My non-thread-safe-mapper is running concurrently ?
Thanks
Boaz
On Thu, Apr 4, 2013 at 5:39 PM, Brian Goetz <brian.goetz at oracle.com> wrote:
> Let me make a real world analogy.
>
> Replace "stream" with "package".
> Replace "non thread safe mapper" with "bomb".
>
> Boaz concludes: "Don't send packages in the mail, someone could get hurt
> because the package might have a bomb in it."
>
> Brian logic: "Don't send packages in the mail that have bombs in them."
>
> Seriously, streams with non-thread-safe lambdas are like bombs. Don't
> make bombs, and no one blows up, no matter how many packages we send each
> other!
>
> Now, let's rewind and bring this conversation back to the list -- can you
> summarize your question on-list so everyone can see the answer? Knowing in
> advance that I will poke some fun at you :)
>
>
> On 4/4/2013 10:30 AM, Boaz Nahum wrote:
>
>> Becuase, if
>>
>> Me:
>> ----
>>
>> Stream<T> foo() {
>>
>> return s.sequential().map(**nonThreadSafeMapper);
>>
>> }
>>
>>
>> You:
>> ------
>> foo().parallel(). .....
>>
>> Then my non thread safe mapper will be run concurrently !
>>
>> Thanks
>> Boaz
>>
>>
>>
>>
>>
>> On Thu, Apr 4, 2013 at 5:16 PM, Brian Goetz <brian.goetz at oracle.com
>> <mailto:brian.goetz at oracle.com**>> wrote:
>>
>> Exactly the opposite!
>>
>> All streams should be usable and produce correct results under
>> either sequential or parallel execution. Why would this advice make
>> you think we were telling you not to return streams?
>>
>>
>> On 4/4/2013 10:14 AM, Boaz Nahum wrote:
>>
>> I understand. But still don't know how to solve my problem ?
>>
>> If I understood right, You are telling me don't write libraries
>> that
>> return a Stream ? Because you never know how your stream will be
>> used ?
>>
>> Thank
>> Boaz
>>
>>
>>
>>
>>
>>
>>
>> On Thu, Apr 4, 2013 at 5:05 PM, Brian Goetz
>> <brian.goetz at oracle.com <mailto:brian.goetz at oracle.com**>
>> <mailto:brian.goetz at oracle.com
>>
>> <mailto:brian.goetz at oracle.com**>__>> wrote:
>>
>> This was simplified recently.
>>
>> There is *one* sequential/parallel bit for the whole
>> pipeline. The
>> stream starts off with it set one way or the other. These
>> calls
>> overwrite it. The bit is only acted on when you actually
>> start the
>> computation (invoke the terminal operation.)
>>
>>
>> On 4/4/2013 9:21 AM, Boaz Nahum wrote:
>>
>> When I invoked parallel() or sequential() how backward
>> it goes ?
>>
>> Let me explain, I wrote a simple Consumer that report
>> how many
>> different
>> threads used to run it:
>>
>> source.
>> parallel().peek(new
>> ThreadReporter("Segement 1
>> parallel")).
>> sequential().peek(new
>> ThreadReporter("Segement 2
>> sequential")).
>> parallel().peek(new
>> ThreadReporter("Segement 3
>> parallel")).
>> sequential().peek(new
>> ThreadReporter("Segement 4
>> sequential")).forEach((t) -> {});
>>
>>
>>
>> private static class ThreadReporter implements
>> Consumer<Integer> {
>>
>>
>> @Override
>> public void accept(Integer integer) {
>> threads.put(Thread.____**currentThread(),
>>
>> true);
>>
>> }
>>
>> public void report() {
>> System.out.println("Name +'" + name + "':
>> " +
>> threads.size() +
>> " Thread(s)");
>> }
>> }
>>
>>
>>
>>
More information about the lambda-dev
mailing list