.start() 方法后的线程执行
Thread execution after .start() method
我想知道在以下情况下会发生什么:
创建了两个线程:
Thread t1 = new Thread();
Thread t2 = new Thread();
假设这些只是打印出一个字符串,然后线程调用 .start() 方法:
t1.start();
t2.start():
我的问题是为什么这些线程每次都以看似随机的顺序打印?我知道线程并发执行,但由于主进程的顺序执行,t1
不会总是在 t2
之前完成吗?
Thread.start()
不保证执行。它只会使线程状态 运行nable 并移交给线程调度程序。线程调度程序决定了 运行 什么时候使用哪个线程。
如果您需要代码在多个线程上按定义的顺序执行,则需要在这些线程之间添加同步代码。
否则,系统可以按照它认为合适的任何顺序自由安排执行。
在 Thread
上调用 start() 不一定会导致线程 运行 立即 之后。在您的调用 start()
和线程的 run()
方法的第一行实际上是 运行 之间可能会发生其他事情。即使您的 run()
实际上是 运行ning,也有可能在您的 run()
方法完成之前、期间或之后发生其他事情。
在您的问题中,您说:"assume these just print out a string" – 这是 run()
的实现:
public void run() {
System.out.println("my name is: " + getName());
}
所以有可能 t1
开始 到 运行 首先,但在它真正调用 System.out.println
之前, t2
是允许执行并 运行s 完成,然后 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 t1 = new Thread();
Thread t2 = new Thread();
假设这些只是打印出一个字符串,然后线程调用 .start() 方法:
t1.start();
t2.start():
我的问题是为什么这些线程每次都以看似随机的顺序打印?我知道线程并发执行,但由于主进程的顺序执行,t1
不会总是在 t2
之前完成吗?
Thread.start()
不保证执行。它只会使线程状态 运行nable 并移交给线程调度程序。线程调度程序决定了 运行 什么时候使用哪个线程。
如果您需要代码在多个线程上按定义的顺序执行,则需要在这些线程之间添加同步代码。
否则,系统可以按照它认为合适的任何顺序自由安排执行。
在 Thread
上调用 start() 不一定会导致线程 运行 立即 之后。在您的调用 start()
和线程的 run()
方法的第一行实际上是 运行 之间可能会发生其他事情。即使您的 run()
实际上是 运行ning,也有可能在您的 run()
方法完成之前、期间或之后发生其他事情。
在您的问题中,您说:"assume these just print out a string" – 这是 run()
的实现:
public void run() {
System.out.println("my name is: " + getName());
}
所以有可能 t1
开始 到 运行 首先,但在它真正调用 System.out.println
之前, t2
是允许执行并 运行s 完成,然后 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