詳解Java中Thread 和Runnable區(qū)別
Thread 和Runnable 關系
Thread類是接口Runnable的一個實現(xiàn)類。
public class Thread implements Runnable
源碼分析
Thread Threa類運行的時候調用start()方法,源代碼如下:
調用start()方法,實際運行的是start0方法,方法聲明如下:
private native void start0()
native表明這個方法是個原生函數(shù),即這個函數(shù)是用C/C++實現(xiàn)的,被編譯成DLL,由Java調用。
native 方法是在注冊是在Thread對象初始化完成的,如圖,靜態(tài)塊static里有個registerNatives方法,該方法會注冊一些本地方法供Thread類使用。
start0方法會在JVM 新建一個線程
Runnable Runnable 接口只有一個run()方法,完全是線程運行規(guī)范。
代碼實例分析
Thread類定義一個賣票的類
public class TicketThread extends Thread { private int ticket = 100000; @Override public void run() { for (int i = 0; i < 100000; i++) { if (ticket > 0) { System.out.println("ticket=" + ticket-- + "," + Thread.currentThread().getName()); } } } }
啟動三個線程
new TicketThread().start(); new TicketThread().start(); new TicketThread().start();
運行發(fā)展每個線程獨立執(zhí)行了賣票的任務,每個線程中票數(shù)依次減1。
Runnable接口實現(xiàn)一個賣票的類
public class TicketRunnableThread implements Runnable { private int ticket = 1000; public void run() { for (int i = 0; i < 1000; i++) { if (ticket > 0) { System.out.println("ticket=" + ticket-- + "," + Thread.currentThread().getName()); } } } }
啟動三個線程
TicketRunnableThread ticketRunnableThread = new TicketRunnableThread(); new Thread(ticketRunnableThread).start(); new Thread(ticketRunnableThread).start(); new Thread(ticketRunnableThread).start();
三個線程共同完成了賣票任務,然而三個線程共同執(zhí)行同一段代碼,會造成線程不安全,可以通過加鎖解決。
使用選擇
實現(xiàn)Runnable接口的同時,還可以繼承其他類,避免Java的單繼承性帶來局限性。
Runnable接口可以實現(xiàn)資源共享,Thread無法完成資源共享。
以上所述是小編給大家介紹的Java中Thread 和Runnable區(qū)別 詳解整合,希望對大家有所幫助,如果大家有任何疑問請給我留言,小編會及時回復大家的。在此也非常感謝大家對腳本之家網(wǎng)站的支持!
相關文章
基于@MapperScan和@ComponentScan的使用區(qū)別
這篇文章主要介紹了@MapperScan和@ComponentScan的使用區(qū)別,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2021-09-09Java動態(tài)修改配置即時生效的方式WatchService
這篇文章給大家分享了Java動態(tài)修改配置即時生效的方式WatchService的相關知識點內(nèi)容,有興趣的朋友可以參考學習下。2018-06-06Java List接口與Iterator接口及foreach循環(huán)使用解析
這篇文章主要介紹了Java List接口與Iterator接口及foreach循環(huán),主要包括List接口與Iterator接口及foreach循環(huán)具體的使用方法和代碼,需要的朋友可以參考下2022-04-04