看清楚Thread類中run()和start()方法的區別:
run()方法:如果在其他地方調用run方法,就是調用一個普通方法。和其他調用方法一樣,比如person.eat(); 而且直接調用run可以重複多次調用;
start()方法:啓動一個線程,調用該Runnable對象的run()方法,不能多次啓動一個線程。
上個例子,註釋說的很清楚!
public class ThreadTest {
/**
* 觀察直接調用run()和用start()啓動一個線程的差別
*
* @param args
* @throws Exception
*/
public static void main(String[] args){
Thread thread=new ThreadDemo();
//第一種
//表明: run()和其他方法的調用沒任何不同,main方法按順序執行了它,並打印出最後一句
//thread.run();
//第二種
//表明: start()方法重新創建了一個線程,在main方法執行結束後,由於start()方法創建的線程沒有運行結束,
//因此主線程未能退出,直到線程thread也執行完畢.這裏要注意,默認創建的線程是用戶線程(非守護線程)
//thread.start();
//第三種
//1、爲什麼沒有打印出100句呢?因爲我們將thread線程設置爲了daemon(守護)線程,程序中只有守護線程存在的時候,是可以退出的,所以只打印了七句便退出了
//2、當java虛擬機中有守護線程在運行的時候,java虛擬機會關閉。當所有常規線程運行完畢以後,
//守護線程不管運行到哪裏,虛擬機都會退出運行。所以你的守護線程最好不要寫一些會影響程序的業務邏輯。否則無法預料程序到底會出現什麼問題
//thread.setDaemon(true);
//thread.start();
//第四種
//用戶線程可以被System.exit(0)強制kill掉,所以也只打印出七句
thread.start();
System.out.println("main thread is over");
System.exit(1);
}
public static class ThreadDemo extends Thread{
@Override
public void run() {
for (int i = 0; i < 100; i++) {
System.out.println("This is a Thread test"+i);
}
}
}
}