Вызов 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