Java線程中run和start方法的區別
Thread類中run()和start()方法的區別如下:
run()方法:在本線程內調用該Runnable對象的run()方法,可以重複多次調用;
start()方法:啓動一個線程,調用該Runnable對象的run()方法,不能多次啓動一個線程;
package com.ljq.test; 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); } } }