字符串列表未并行运行 - Java 8 并行流

问题描述

我需要使用并行流运行一个集合,它总是按顺序运行,在下面的示例中,List 总是按顺序运行,而 IntStream 是并行运行的。有人可以帮助我理解在 Stream 上运行并行 IntStream 和在 Stream 上运行并行 List<String>间的区别吗。

此外,您能否帮助说明如何并行运行 List<String>代码片段,类似于 IntStream 的并行运行方式?

import java.util.List;
import java.util.stream.IntStream;

public class ParallelCollectionTest {

    public static void main(String[] args) {

        System.out.println("Parallel int stream testing.. ");
        IntStream range2 = IntStream.rangeClosed(1,5);
        range2.parallel().peek(t -> {
            System.out.println("before");
            try {
                Thread.sleep(1000);
            } catch (InterruptedException e) {
                e.printstacktrace();
            }
        }).forEachOrdered(System.out::println);

        System.out.println("Parallel String collection testing.. ");
        List<String> list = List.of("a","b","c","d");
        list.stream().parallel().forEachOrdered(o ->
                {
                    System.out.println("before");
                    try {
                        Thread.sleep(10000);
                    } catch (InterruptedException e) {
                        e.printstacktrace();
                    }
                    System.out.println(o);
                });
    }

}

以上代码输出如下。

Parallel int stream testing.. 
before
before
before
before
before
1
2
3
4
5
Parallel String collection testing.. 
before
a
before
b
before
c
before
d

解决方法

不同的行为不是由不同的流(copyable<> public class PlayActivity extends AppCompatActivity implements Callback,PlayAdapter.OnItemClickListener { @Override public boolean onCreateOptionsMenu(Menu menu) { getMenuInflater().inflate(R.menu.options_menu,menu); return true; } @Override public boolean onOptionsItemSelected(MenuItem item) { while (player == null) { initPlayer(); if (player != null) break; } if (hasVideoEverStarted) { switch (item.getItemId()) { case R.id.mute_unmute: dialogUtil.defaultAlertDialog(this,null,"Mute or Unmute the Video",new String[]{"Mute","Unmute"},"mute_unmute",player); return true; else { if (item.getItemId() != android.R.id.home) showToast("Start a video first"); return super.onOptionsItemSelected(item); } } )引起的。

你的两个流管道的逻辑不一样。

IntStream 代码段中,您在 Stream<String> 调用中执行 IntStream,这允许它针对不同元素并行运行,这就是管道快速结束的原因。>

sleep 片段中,您正在 peek() 中执行 Stream<String>,这意味着每个元素的 sleep 必须在 forEachOrdered 之后执行前一个元素结束。这就是 sleep() - sleep()

的行为

如果您添加一个 forEachOrdered 调用,您可以使第二个代码段的行为类似于第一个:

This operation processes the elements one at a time,in encounterorder if one exists.

现在它会产生:

peek()