繁体   English   中英

在java中执行新创建的线程的顺序是什么

[英]What is the order of execution of newly created threads in java

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();
    }
}

在上面的代码中,当我从main调用starter时。 我创建了四个新的线程来调用同步函数。 我知道无法预测线程的执行顺序。 除非它们都等待一段时间,否则第一个线程可以完成并从同步块中退出。 在这种情况下,我希望所有线程都保存在队列中,所以我希望答案为
0
1
2
3
但始终如一(我运行程序超过20次)我得到的输出为
0
3
2
1
这意味着线程被保存在堆栈而不是队列中。 为什么会这样? 谷歌搜索结果中的每个答案都说它是一个队列,但我把它作为一个堆栈。 我想知道将线程保存在堆栈中的原因(这是反直觉的)而不是队列?

线程启动的顺序取决于操作系统,它未在Java语言规范中指定。 你在主线程中调用start,但是当新线程被分配并且当它开始处理它的Runnable或run方法时,由OS的调度程序决定。

注意不要依赖线程发生的顺序。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM