詳解Java中Thread 和Runnable區(qū)別
Thread 和Runnable 關(guān)系
Thread類(lèi)是接口Runnable的一個(gè)實(shí)現(xiàn)類(lèi)。
public class Thread implements Runnable
源碼分析
Thread Threa類(lèi)運(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類(lèi)使用。

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

代碼實(shí)例分析
Thread類(lèi)定義一個(gè)賣(mài)票的類(lèi)
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è)線(xiàn)程
new TicketThread().start(); new TicketThread().start(); new TicketThread().start();
運(yùn)行發(fā)展每個(gè)線(xiàn)程獨(dú)立執(zhí)行了賣(mài)票的任務(wù),每個(gè)線(xiàn)程中票數(shù)依次減1。
Runnable接口實(shí)現(xiàn)一個(gè)賣(mài)票的類(lèi)
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è)線(xiàn)程
TicketRunnableThread ticketRunnableThread = new TicketRunnableThread(); new Thread(ticketRunnableThread).start(); new Thread(ticketRunnableThread).start(); new Thread(ticketRunnableThread).start();
三個(gè)線(xiàn)程共同完成了賣(mài)票任務(wù),然而三個(gè)線(xiàn)程共同執(zhí)行同一段代碼,會(huì)造成線(xiàn)程不安全,可以通過(guò)加鎖解決。
使用選擇
實(shí)現(xiàn)Runnable接口的同時(shí),還可以繼承其他類(lèi),避免Java的單繼承性帶來(lái)局限性。
Runnable接口可以實(shí)現(xiàn)資源共享,Thread無(wú)法完成資源共享。
以上所述是小編給大家介紹的Java中Thread 和Runnable區(qū)別 詳解整合,希望對(duì)大家有所幫助,如果大家有任何疑問(wèn)請(qǐng)給我留言,小編會(huì)及時(shí)回復(fù)大家的。在此也非常感謝大家對(duì)腳本之家網(wǎng)站的支持!
相關(guān)文章
基于@MapperScan和@ComponentScan的使用區(qū)別
這篇文章主要介紹了@MapperScan和@ComponentScan的使用區(qū)別,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2021-09-09
Java消息隊(duì)列RabbitMQ入門(mén)詳解
這篇文章主要介紹了Java消息隊(duì)列RabbitMQ入門(mén)詳解,RabbitMQ是使用Erlang語(yǔ)言開(kāi)發(fā)的開(kāi)源消息隊(duì)列系統(tǒng),基于A(yíng)MQP協(xié)議 來(lái)實(shí)現(xiàn),AMQP的主要特征是面向消息、隊(duì)列、路由(包括點(diǎn)對(duì)點(diǎn)和發(fā)布 /訂閱)、可靠性、安全,需要的朋友可以參考下2023-07-07
Java并發(fā)實(shí)例之CyclicBarrier的使用
這篇文章主要介紹了Java并發(fā)實(shí)例之CyclicBarrier的使用,涉及CyclicBarrier的介紹,以及相關(guān)的并發(fā)實(shí)例,具有一定參考價(jià)值,需要的朋友可以了解下。2017-11-11
SpringCloud Nacos集群搭建過(guò)程詳解
Nacos集群不僅僅是服務(wù)注冊(cè)中心,還在微服務(wù)架構(gòu)中發(fā)揮著關(guān)鍵的角色,支持多種場(chǎng)景下的服務(wù)治理和協(xié)調(diào),本文介紹了如何在SpringCloud環(huán)境中搭建Nacos集群,為讀者提供了一份清晰而詳盡的指南,通過(guò)逐步演示每個(gè)關(guān)鍵步驟,讀者能夠輕松理解并操作整個(gè)搭建過(guò)程2024-02-02
Java動(dòng)態(tài)修改配置即時(shí)生效的方式WatchService
這篇文章給大家分享了Java動(dòng)態(tài)修改配置即時(shí)生效的方式WatchService的相關(guān)知識(shí)點(diǎn)內(nèi)容,有興趣的朋友可以參考學(xué)習(xí)下。2018-06-06
Java List接口與Iterator接口及foreach循環(huán)使用解析
這篇文章主要介紹了Java List接口與Iterator接口及foreach循環(huán),主要包括List接口與Iterator接口及foreach循環(huán)具體的使用方法和代碼,需要的朋友可以參考下2022-04-04
Java多線(xiàn)程實(shí)現(xiàn)快速切分文件的程序
這篇文章主要為大家詳細(xì)介紹了Java多線(xiàn)程實(shí)現(xiàn)快速切分文件的相關(guān)資料,感興趣的小伙伴們可以參考一下2016-06-06

