詳解Java中Thread 和Runnable區(qū)別
Thread 和Runnable 關(guān)系
Thread類是接口Runnable的一個(gè)實(shí)現(xiàn)類。
public class Thread implements Runnable
源碼分析
Thread Threa類運(yùn)行的時(shí)候調(diào)用start()方法,源代碼如下:

調(diào)用start()方法,實(shí)際運(yùn)行的是start0方法,方法聲明如下:
private native void start0()
native表明這個(gè)方法是個(gè)原生函數(shù),即這個(gè)函數(shù)是用C/C++實(shí)現(xiàn)的,被編譯成DLL,由Java調(diào)用。
native 方法是在注冊(cè)是在Thread對(duì)象初始化完成的,如圖,靜態(tài)塊static里有個(gè)registerNatives方法,該方法會(huì)注冊(cè)一些本地方法供Thread類使用。

start0方法會(huì)在JVM 新建一個(gè)線程
Runnable Runnable 接口只有一個(gè)run()方法,完全是線程運(yùn)行規(guī)范。

代碼實(shí)例分析
Thread類定義一個(gè)賣票的類
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());
}
}
}
}
啟動(dòng)三個(gè)線程
new TicketThread().start(); new TicketThread().start(); new TicketThread().start();
運(yùn)行發(fā)展每個(gè)線程獨(dú)立執(zhí)行了賣票的任務(wù),每個(gè)線程中票數(shù)依次減1。
Runnable接口實(shí)現(xiàn)一個(gè)賣票的類
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());
}
}
}
}
啟動(dòng)三個(gè)線程
TicketRunnableThread ticketRunnableThread = new TicketRunnableThread(); new Thread(ticketRunnableThread).start(); new Thread(ticketRunnableThread).start(); new Thread(ticketRunnableThread).start();
三個(gè)線程共同完成了賣票任務(wù),然而三個(gè)線程共同執(zhí)行同一段代碼,會(huì)造成線程不安全,可以通過加鎖解決。
使用選擇
實(shí)現(xiàn)Runnable接口的同時(shí),還可以繼承其他類,避免Java的單繼承性帶來(lái)局限性。
Runnable接口可以實(shí)現(xiàn)資源共享,Thread無(wú)法完成資源共享。
以上所述是小編給大家介紹的Java中Thread 和Runnable區(qū)別 詳解整合,希望對(duì)大家有所幫助,如果大家有任何疑問請(qǐng)給我留言,小編會(huì)及時(shí)回復(fù)大家的。在此也非常感謝大家對(duì)腳本之家網(wǎng)站的支持!
相關(guān)文章
java 中設(shè)計(jì)模式(值對(duì)象)的實(shí)例詳解
這篇文章主要介紹了java 中設(shè)計(jì)模式(值對(duì)象)的實(shí)例詳解的相關(guān)資料,希望通過本文能幫助到大家,需要的朋友可以參考下2017-09-09
MyBatis使用<foreach>標(biāo)簽報(bào)錯(cuò)問題及解決
這篇文章主要介紹了MyBatis使用<foreach>標(biāo)簽報(bào)錯(cuò)問題及解決,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2024-03-03
Springboot死信隊(duì)列?DLX?配置和使用思路分析
死信隊(duì)列簡(jiǎn)稱就是DLX,死信交換機(jī)和死信隊(duì)列和普通的沒有區(qū)別,當(dāng)消息成為死信后,如果該隊(duì)列綁定了死信交換機(jī),則消息會(huì)被死信交換機(jī)重新路由到死信隊(duì)列,本文給大家介紹Springboot死信隊(duì)列?DLX的相關(guān)知識(shí),感興趣的朋友一起看看吧2022-03-03
Java class文件格式之?dāng)?shù)據(jù)類型(二)_動(dòng)力節(jié)點(diǎn)Java學(xué)院整理
這篇文章主要介紹了Java class文件格式之?dāng)?shù)據(jù)類型(二)的相關(guān)資料,需要的朋友可以參考下2017-06-06
淺談Java的虛擬機(jī)結(jié)構(gòu)以及虛擬機(jī)內(nèi)存的優(yōu)化
這篇文章主要介紹了Java的虛擬機(jī)結(jié)構(gòu)以及虛擬機(jī)內(nèi)存的優(yōu)化,講到了JVM的堆和??臻g及GC垃圾回收等重要知識(shí),需要的朋友可以參考下2016-03-03
Java中Final關(guān)鍵字的使用技巧及其性能優(yōu)勢(shì)詳解
這篇文章主要介紹了Java中Final關(guān)鍵字的使用技巧及其性能優(yōu)勢(shì)詳解,Java中的final關(guān)鍵字用于修飾變量、方法和類,可以讓它們?cè)诙x后不可更改,從而提高程序的穩(wěn)定性和可靠性,此外,final關(guān)鍵字還有一些使用技巧和性能優(yōu)勢(shì),需要的朋友可以參考下2023-10-10
SpringBoot統(tǒng)一api返回風(fēng)格的實(shí)現(xiàn)
這篇文章主要介紹了SpringBoot統(tǒng)一api返回風(fēng)格的實(shí)現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2021-03-03

