Второй параллельный поток начинается до завершения первого - PullRequest
0 голосов
/ 25 января 2019
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 работают. Я пока не вижу sysout для 2, и не исключение на сервере и в программе.

Мне интересно, как это могло вызвать 11 до завершения 2?

1 Ответ

0 голосов
/ 25 января 2019

Что-то не так в вопросе. Вот код, который я написал, и в моем примере первый поток всегда завершается перед вторым потоком.

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, которая выполняет действия в фоновом режиме, и поэтому второй поток запускается до завершения первого потока.

...