Выполнение потока после метода .start () - PullRequest
3 голосов
/ 02 октября 2019

Мне интересно, что происходит в следующем сценарии:

Создаются два потока:

Thread t1 = new Thread();
Thread t2 = new Thread();

Предположим, что они просто распечатывают строку, после чего потоки вызывают .start ()Метод:

t1.start();
t2.start():

Мой вопрос: почему эти темы печатаются в случайном порядке каждый раз? Я знаю, что потоки выполняются одновременно, но не завершится ли t1 раньше t2 из-за последовательного выполнения основного процесса?

Ответы [ 3 ]

2 голосов
/ 02 октября 2019

Вызов start () для Thread не обязательно приводит к тому, что поток запускает сразу после. Возможны другие вещи между вашим вызовом start() и первой строкой метода run() вашего потока, который фактически выполняется. И даже когда ваш run() действительно запущен, возможно, что другие вещи произойдут до, во время или после завершения вашего run() метода.

В своем вопросе вы сказали: "примите этипросто распечатайте строку " - вот реализация run(), которая делает это:

public void run() {
    System.out.println("my name is: " + getName());
}

Так что вполне возможно, что t1 начинает запускаться первым, но дона самом деле он вызывает System.out.println, t2 разрешено выполнять и выполняется до завершения, затем t1 возобновляется.

Если этот тип поведения не будет работать в вашем случае использования, вам понадобитсядобавить некоторую защиту от параллелизма для координации того, как и когда запускаются ваши потоки.

ОБНОВЛЕНИЕ:

Чтобы проиллюстрировать непредсказуемую последовательность выполнения потоков, запустите этот код несколькои посмотрите на результат:

public class Example {
    public static void main(String[] args) {
        for (int k = 0; k < 10; k++) {
            new TestThread(k).start();
        }
    }
}

class TestThread extends Thread {
    private final int k;

    TestThread(int k) {
        this.k = k;
    }

    @Override
    public void run() {
        System.out.print(k + " ");
    }
}

Вот результат одного из моих локальных прогонов:

7 0 1 5 4 6 3 2 8 9 
2 голосов
/ 02 октября 2019

Thread.start() не гарантирует исполнения. Он просто сделает состояние потока работоспособным и передаст его планировщику потоков. Это планировщик потоков, который решает, какой поток запускать когда.

0 голосов
/ 02 октября 2019

Если вам требуется, чтобы код выполнялся в определенном порядке в нескольких потоках, вам необходимо добавить код синхронизации между этими потоками.

В противном случае система может свободно планировать выполнение в любом порядке, который она сочтет нужным.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...