在 .start() 方法之后执行线程



我想知道在以下情况下会发生什么:

将创建两个线程:

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

假设这些只是打印出一个字符串,然后线程调用 .start(( 方法:

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

我的问题是为什么这些线程每次都以看似随机的顺序打印?我知道线程并发执行,但由于主进程的顺序执行,t1并不总是在t2之前完成吗?

Thread上调用 start(( 并不一定会导致线程随其后运行。在调用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 
Thread.start()

不保证执行。它只会使线程状态可运行并移交给线程调度程序。线程调度程序决定何时运行哪个线程。

如果需要代码在多个线程上按定义的顺序执行,则需要在这些线程之间添加同步代码。

否则,系统可以自由地按照它认为合适的任何顺序安排执行。

最新更新