第二个并行流在完成第一个并行流之前开始

时间:2019-01-25 05:52:21

标签: java parallel-processing java-stream

import java.util.Arrays;
import java.util.List;
import java.util.Random;

public class Main {

    public static void main(String[] args) {
        List<Integer> fullList = Arrays.asList(1,2,3,4,5,6,7,8,9,10,11,12,13,14);
        List<Integer> toBeLast = Arrays.asList(9,10,11,12);
        Random r = new Random();

        fullList.parallelStream().filter(l->!toBeLast .contains(l)).forEach(l->{
        System.out.println("L1 : " + e);
            try {

                Thread.sleep(Math.abs(r.nextLong() % 1000));
                    System.out.println(l);
            }
            catch(InterruptedException i) {

            }
        });

        toBeLast .parallelStream().forEach(l->{
            System.out.println("L2 : " + e);
                try {

                    Thread.sleep(Math.abs(r.nextLong() % 1000));
                    System.out.println(l);
                }
                catch(InterruptedException i) {

                }
        });

    }
}

期望-完成1-8、13-14并开始9-12。

rest调用将触发服务器中的sh脚本,每个脚本将花费15-90秒。 实际-在服务器上,我看到2和11的脚本正在运行。我还没有看到2的sysout,服务器和程序中也没有例外。

我想知道在完成2之前如何触发11?

1 个答案:

答案 0 :(得分:0)

问题不对劲。这是我编写的代码,在我的示例中,第一个流总是在第二个流之前完成。

import java.util.Arrays;
import java.util.List;
import java.util.Random;

public class Main {

    public static void main(String[] args) {

        List<Integer> l1 = Arrays.asList(1,2,3,4,5,6,7,8,9,10,11,12,13,14,1,2,3,4,5,6,7,8,9,10,11,12,13,14,1,2,3,4,5,6,7,8,9,10,11,12,13,14,1,2,3,4,5,6,7,8,9,10,11,12,13,14);
        List<Integer> l2 = Arrays.asList(21,22,23,24,25,26,27,28,29,30,31,32,33,34,21,22,23,24,25,26,27,28,29,30,31,32,33,34,21,22,23,24,25,26,27,28,29,30,31,32,33,34,21,22,23,24,25,26,27,28,29,30,31,32,33,34);
        Random r = new Random();

        l1.parallelStream().forEach(e -> {
            System.out.println("L1 : " + e);
            try {

                Thread.sleep(Math.abs(r.nextLong() % 1000));
            }
            catch(InterruptedException i) {

            }
        });
        l2.parallelStream().forEach(e -> {
            System.out.println("L2 : " + e);
            try {

                Thread.sleep(Math.abs(r.nextLong() % 1000));
            }
            catch(InterruptedException i) {

            }
        });
    }
}

我的猜测是您使用的HTTP客户端库在后台进行活动,因此第二个流在第一个流完成之前就已开始。