區(qū)別對(duì)比如下:
我們知道Java中的線程是通過Java.lang.Thread來實(shí)現(xiàn)的,那么我們就可以通過實(shí)例化Thread一個(gè)對(duì)象來創(chuàng)建一個(gè)線程,然后再調(diào)用start()啟動(dòng),但是Thread的一個(gè)特定的方法run()也可以啟動(dòng)線程,那么這兩個(gè)方法有什么區(qū)別呢?
線程狀態(tài)
在Java當(dāng)中,線程通常有五種狀態(tài):創(chuàng)建、運(yùn)行、阻塞、等待、終止 NEW------------------->新建狀態(tài),沒有調(diào)用start()之前的狀態(tài) RUNNABLE---------->運(yùn)行狀態(tài),(running執(zhí)行中,ready就緒(等待cpu時(shí)間片)) BLOCKED------------>阻塞狀態(tài), WAITING-------------->等待狀態(tài),沒有明確的等待結(jié)束時(shí)間,調(diào)用wait() TIMED_WAITING—>超時(shí)等待狀態(tài),有明確的等待時(shí)間,如:sleep(xxx) TERMINATED-------->終止?fàn)顟B(tài)
多線程原理:
我們一般使用thread new一個(gè)線程,然后調(diào)用start方法啟動(dòng),線程就會(huì)處于運(yùn)行狀態(tài)中ready,等待CPU調(diào)度,然后再執(zhí)行線程里面的run()方法,使用start方法才真正實(shí)現(xiàn)了多線程運(yùn)行,因?yàn)檫@個(gè)時(shí)候不用等待我們的run方法執(zhí)行完成就可以繼續(xù)執(zhí)行下面的代碼,這才叫多線程。
如果直接使用thread執(zhí)行run方法會(huì)怎么樣呢?
因?yàn)閞un方法是thread里面的一個(gè)普通的方法,如果直接調(diào)用run()方法,這個(gè)時(shí)候它會(huì)運(yùn)行在主線程中的,因?yàn)槌绦蛑兄挥兄骶€程一個(gè)線程,如果有兩個(gè)線程,都是直接調(diào)用run()方法,那么他們的執(zhí)行順序一定是按順序執(zhí)行的,并沒有實(shí)現(xiàn)多線程的目的。
免費(fèi)學(xué)習(xí)視頻分享:java視頻教程
代碼對(duì)比
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()方法,線程名是默認(rèn)的
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