在此程序中,为什么Thread [Two,5,main]出现在One:5之前?

问题描述

|
package javaapplication18;
class Alistair_Therein implements Runnable{
String name
     Thread t;
     Alistair_Therein(String threadname){
         name = threadname;
         t = new Thread(this,name);
         System.out.println(\"New thread:\" + t);
         t.start();
     }
     public void run(){
         try{
             for(int i=5; i>0; i--){
                 System.out.println(name \" : \" + i);
                 Thread.sleep(1000);
             }
         }catch(InterruptedException e) {
             System.out.println(name + \"interrupted\");
         }
         System.out.println(name + \"exiting\");
     }


 }

public class Main {


    public static void main(String[] args) {
        new Alistair_Therein(\"One\");
        new Alistair_Therein(\"Two\");
        new Alistair_Therein(\"Three\");
        try{

                Thread.sleep(10000);
            }
        }catch(InterruptedException e){
            System.out.println(\"Main Thread interrupted\");
        }
        System.out.println(\"Main thread exiting.\");
    }

}
输出: 新主题主题[1,5,主] 新线程:Thread [Two,5,main] 新线程:线程[三,五,主要] 一:5 2:5 三:5 一:4 2:4 三:4 一:3 2:3 三:3 一:2 2:2 三:2 一:1 二:1 三:1 一个正在退出。 两个出口。 三人退出。 主线程退出。 为什么ѭ1出现在
One: 5
之前?     

解决方法

        除非您使用同步结构,否则无法保证您将看到不同线程中的事件发生的顺序。 [在这种特定情况下,我猜想,发起线程所涉及的开销要比发起新对象所涉及的开销大得多,因此,创建新对象会“赢得”。     ,        请注意,“ 3”并不意味着新创建的线程的“ 4”方法中的代码将在该精确时刻启动。它只是将线程置于可运行状态,并让调度程序决定何时实际运行。 在所有新创建的线程执行代码之前,所有3个5个对象的构造很可能会一次性运行。 另请注意,打印到
System.out
(或
System.err
)会强制进行同步,这很容易影响测试结果。     ,        线程被设计为可同时并独立运行(这是重点)。独立线程的输出可以以任何顺序发生。     ,        这是因为您正在打印线程。\“ Thread [One,5,main] \”之所以被打印,是因为这些是线程的详细信息。 \“一个\”在这里指出线程名称。 \“ 5 \”此处指出线程优先级编号。 \“ main \”代表线程组。 如果您对此行发表评论   // System.out.println(\“新线程:\” + t); 线程[1,5,main]将不会显示。     

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...