如果你想理解其中的奥妙,请看操作系统的书。
实际上,并不是每一个程序在系统里面都是连续执行的,系统会分时间片来执行不同的线程(你的程序运行起来至少是一个线程),这是由不得java控制的。
运行时,系统会根据当前资源来选择是否执行你的程序。你可以把下面的程序运行多几下,就会发现结果并不是一样的。(在运行前,你可以想想按照你原来的理解应该输出什么结果)总之,结果不同,是系统调用问题,而不是sleep问题。让然,如果你的sleep时间很大,超过了系统时间片轮换时间,就会按照顺序输出(Main里面的改成:Thread.sleep(1000);public class TestThread extends Thread {
private int myId = 0;
TestThread (int i) {
myId = i;
}
public void run(){
try {
System.out.println("This is begin of thread " + myId);
sleep(1);
System.out.println("This is end of thread " + myId);
}
catch(java.lang.InterruptedException e) {
System.out.println("Error in thread " + myId + " : " + e);
}
}
 public static void main(String args[]) {
  try {
for(int i=0; i<10; i++) {
TestThread test = new TestThread(i);
test.start();
Thread.sleep(1);
}
}
catch(Exception e) {
}
}
}

解决方案 »

  1.   

    “Daemon”线程的作用是在程序的运行期间于后台提供一种“常规”服务,但它并不属于程序的一个基本部分。因此,一旦所有非Daemon线程完成,程序也会中止运行。相反,假若有任何非Daemon线程仍在运行(比如还有一个正在运行main()的线程),则程序的运行不会中止。--------摘至<<thinking in java>>Daemon线程将自己的Daemon标记设置成“真”,然后产生一系列其他线程,而且认为它们也具有Daemon属性。随后,它进入一个无限循环,在其中调用yield().这样你的程序的结束就决定main函数,即决定于主线程sleep函数;记住你创建的其它daemon线程是和主程序同时运行的,所以主线程sleep的数值一旦达到,程序终止.你在之前创建的一系列具有Daemon属性的线程也会终止,这样就会对其他线程的运行造成影响.   在你的程序中,由于主线程sleep(72毫秒)时间过长,因为这时10个线程都已创建完成,如果改成3,那么便会有线程未创建完,而且每个线程的输出也不会完整(只有DaemonSpawn i started,而没有t[i].isDaemon()= true,----
    --因为每个子线程要sleep10毫秒,而主线程只有3毫秒,程序就结束)同理,若改为13,结果又会不同
    说了这么多,有点乱,希望你能理会-------我也在学thinking,一起加油吧!