【CSDN常見問題解答】Thread的run()和start()方法

看清楚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);
            }
        }
    }
}


發佈了257 篇原創文章 · 獲贊 881 · 訪問量 152萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章