这个问题在这里已经有答案了:
java:线程顺序(6个答案)
上个月关门了。
我正在尝试使用下面的代码找出多线程顺序。
我使用synchonized来阻止其他线程,而其中一个线程正在同步部分中运行。我希望线程1应该首先开始和结束,然后是线程2,最后是线程3。但结果总是1,3,2
为什么会这样?不应该像12 3或13 2那样随机执行吗?
public class hello {
static class runnablethread extends Thread{
private static int k = 5;
public void run() {
synchronized (runnablethread.class) {
System.out.println(Thread.currentThread().getName() + " start:" + System.currentTimeMillis());
try {
Thread.sleep(1000L);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
System.out.println(Thread.currentThread().getName() + " end:" + System.currentTimeMillis());
}
}
public static void main(String[] args) {
runnablethread r1 = new runnablethread();
new Thread(r1,"Thread1").start();
new Thread(r1,"Thread2").start();
new Thread(r1,"Thread3").start();
}
}
Thread1 start:1606114065880
Thread1 end:1606114066885
Thread3 start:1606114066885
Thread3 end:1606114067889
Thread2 start:1606114067889
Thread2 end:1606114068894
1条答案
按热度按时间mm5n2pyu1#
start()方法实际上并不调用run方法,它只是表示线程已经准备好执行调度。然后jvm调度线程的执行,但是这种调度不能保证调度的顺序与它们启动的顺序相同。
在您的特定情况下,代码序列
执行得很快,jvm最后有3个线程可以调度。
如果要等待某个线程的终止,可以使用join方法。
也可以使用setpriority()方法更改线程的优先级。
如果代码执行了多次,我们可以注意到线程是随机启动的