siv*_*iva 5 java multithreading java-threads
class Test {
boolean isFirstThread = true;
private synchronized void printer(int threadNo) {
if(isFirstThread) {
try {
Thread.sleep(2000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
isFirstThread = false;
System.out.println(threadNo);
}
public void starter() {
new Thread(){
@Override()
public void run() {
printer(0);
}
}.start();
new Thread(){
@Override()
public void run() {
printer(1);
}
}.start();
new Thread(){
@Override()
public void run() {
printer(2);
}
}.start();
new Thread(){
@Override()
public void run() {
printer(3);
}
}.start();
}
}
Run Code Online (Sandbox Code Playgroud)
在上面的代码中,当我从main调用starter时.我创建了四个新的线程来调用同步函数.我知道无法预测线程的执行顺序.除非它们都等待一段时间,否则第一个线程可以完成并从同步块中退出.在这种情况下,我希望所有线程都保持在一个队列,所以我希望答案为
0
1
2
3
但一致(我运行程序超过20次)我得到的输出为
0
3
2
1
这意味着线程被保存在堆栈而不是队列中.为什么会这样?谷歌搜索结果中的每个答案都说它是一个队列,但我把它作为一个堆栈.我想知道将线程保存在堆栈中的原因(这是反直觉的)而不是队列?
Nat*_*hes 10
线程启动的顺序取决于操作系统,它未在Java语言规范中指定.你在主线程中调用start,但是当新线程被分配并且当它开始处理它的Runnable或run方法时,由OS的调度程序决定.
注意不要依赖线程发生的顺序.