區(qū)別對比如下:
我們知道Java中的線程是通過Java.lang.Thread來實現(xiàn)的,那么我們就可以通過實例化Thread一個對象來創(chuàng)建一個線程,然后再調(diào)用start()啟動,但是Thread的一個特定的方法run()也可以啟動線程,那么這兩個方法有什么區(qū)別呢?
線程狀態(tài)
在Java當中,線程通常有五種狀態(tài):創(chuàng)建、運行、阻塞、等待、終止 NEW------------------->新建狀態(tài),沒有調(diào)用start()之前的狀態(tài) RUNNABLE---------->運行狀態(tài),(running執(zhí)行中,ready就緒(等待cpu時間片)) BLOCKED------------>阻塞狀態(tài), WAITING-------------->等待狀態(tài),沒有明確的等待結束時間,調(diào)用wait() TIMED_WAITING—>超時等待狀態(tài),有明確的等待時間,如:sleep(xxx) TERMINATED-------->終止狀態(tài)
多線程原理:
我們一般使用thread new一個線程,然后調(diào)用start方法啟動,線程就會處于運行狀態(tài)中ready,等待CPU調(diào)度,然后再執(zhí)行線程里面的run()方法,使用start方法才真正實現(xiàn)了多線程運行,因為這個時候不用等待我們的run方法執(zhí)行完成就可以繼續(xù)執(zhí)行下面的代碼,這才叫多線程。
如果直接使用thread執(zhí)行run方法會怎么樣呢?
因為run方法是thread里面的一個普通的方法,如果直接調(diào)用run()方法,這個時候它會運行在主線程中的,因為程序中只有主線程一個線程,如果有兩個線程,都是直接調(diào)用run()方法,那么他們的執(zhí)行順序一定是按順序執(zhí)行的,并沒有實現(xiàn)多線程的目的。
免費學習視頻分享:java視頻教程
代碼對比
public class ThreadDemo5 { public static final boolean flag=false; public static void main(String[] args) { Thread t1=new Thread(new Runnable() { @Override public void run() { System.out.println(Thread.currentThread().getName()); } }); t1.start(); } }
調(diào)用start()方法,線程名是默認的
public class ThreadDemo5 { public static final boolean flag=false; public static void main(String[] args) { Thread t1=new Thread(new Runnable() { @Override public void run() { System.out.println(Thread.currentThread().getName()); } }); t1.run(); } }
調(diào)用run(),線程名是main