问题描述
我需要使用并行流运行一个集合,它总是按顺序运行,在下面的示例中,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()