问题描述
|
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]将不会显示。