Java Thread中start()和run()的區(qū)別_動(dòng)力節(jié)點(diǎn)Java學(xué)院整理
start() 和 run()的區(qū)別說(shuō)明
start() : 它的作用是啟動(dòng)一個(gè)新線(xiàn)程,新線(xiàn)程會(huì)執(zhí)行相應(yīng)的run()方法。start()不能被重復(fù)調(diào)用。
run() : run()就和普通的成員方法一樣,可以被重復(fù)調(diào)用。單獨(dú)調(diào)用run()的話(huà),會(huì)在當(dāng)前線(xiàn)程中執(zhí)行run(),而并不會(huì)啟動(dòng)新線(xiàn)程!
下面以代碼來(lái)進(jìn)行說(shuō)明。
class MyThread extends Thread{
public void run(){
...
}
};
MyThread mythread = new MyThread();
mythread.start()會(huì)啟動(dòng)一個(gè)新線(xiàn)程,并在新線(xiàn)程中運(yùn)行run()方法。
而mythread.run()則會(huì)直接在當(dāng)前線(xiàn)程中運(yùn)行run()方法,并不會(huì)啟動(dòng)一個(gè)新線(xiàn)程來(lái)運(yùn)行run()。
start() 和 run()的區(qū)別示例
下面,通過(guò)一個(gè)簡(jiǎn)單示例演示它們之間的區(qū)別。源碼如下:
// Demo.java 的源碼
class MyThread extends Thread{
public MyThread(String name) {
super(name);
}
public void run(){
System.out.println(Thread.currentThread().getName()+" is running");
}
};
public class Demo {
public static void main(String[] args) {
Thread mythread=new MyThread("mythread");
System.out.println(Thread.currentThread().getName()+" call mythread.run()");
mythread.run();
System.out.println(Thread.currentThread().getName()+" call mythread.start()");
mythread.start();
}
}
運(yùn)行結(jié)果:
main call mythread.run() main is running main call mythread.start() mythread is running
結(jié)果說(shuō)明:
(01) Thread.currentThread().getName()是用于獲取“當(dāng)前線(xiàn)程”的名字。當(dāng)前線(xiàn)程是指正在cpu中調(diào)度執(zhí)行的線(xiàn)程。
(02) mythread.run()是在“主線(xiàn)程main”中調(diào)用的,該run()方法直接運(yùn)行在“主線(xiàn)程main”上。
(03) mythread.start()會(huì)啟動(dòng)“線(xiàn)程mythread”,“線(xiàn)程mythread”啟動(dòng)之后,會(huì)調(diào)用run()方法;此時(shí)的run()方法是運(yùn)行在“線(xiàn)程mythread”上。
start() 和 run()相關(guān)源碼(基于JDK1.7.0_40)
Thread.java中start()方法的源碼如下:
public synchronized void start() {
// 如果線(xiàn)程不是"就緒狀態(tài)",則拋出異常!
if (threadStatus != 0)
throw new IllegalThreadStateException();
// 將線(xiàn)程添加到ThreadGroup中
group.add(this);
boolean started = false;
try {
// 通過(guò)start0()啟動(dòng)線(xiàn)程
start0();
// 設(shè)置started標(biāo)記
started = true;
} finally {
try {
if (!started) {
group.threadStartFailed(this);
}
} catch (Throwable ignore) {
}
}
}
說(shuō)明:start()實(shí)際上是通過(guò)本地方法start0()啟動(dòng)線(xiàn)程的。而start0()會(huì)新運(yùn)行一個(gè)線(xiàn)程,新線(xiàn)程會(huì)調(diào)用run()方法。
private native void start0();
Thread.java中run()的代碼如下:
public void run() {
if (target != null) {
target.run();
}
}
說(shuō)明:target是一個(gè)Runnable對(duì)象。run()就是直接調(diào)用Thread線(xiàn)程的Runnable成員的run()方法,并不會(huì)新建一個(gè)線(xiàn)程。
以上所述是小編給大家介紹的Java Thread中start()和run()的區(qū)別_動(dòng)力節(jié)點(diǎn)Java學(xué)院整理,希望對(duì)大家有所幫助,如果大家有任何疑問(wèn)請(qǐng)給我留言,小編會(huì)及時(shí)回復(fù)大家的。在此也非常感謝大家對(duì)腳本之家網(wǎng)站的支持!
相關(guān)文章
被遺忘的Java關(guān)鍵字transient的使用詳解
在 Java 中,transient 是一個(gè)關(guān)鍵字,用于指定一個(gè)類(lèi)的字段(成員變量)在序列化時(shí)應(yīng)該被忽略。本文將通過(guò)示例為大家簡(jiǎn)單講講transient的使用,需要的可以參考一下2023-04-04
Java concurrency之AtomicLongFieldUpdater原子類(lèi)_動(dòng)力節(jié)點(diǎn)Java學(xué)院整理
AtomicLongFieldUpdater可以對(duì)指定"類(lèi)的 'volatile long'類(lèi)型的成員"進(jìn)行原子更新。它是基于反射原理實(shí)現(xiàn)的。下面通過(guò)本文給大家分享Java concurrency之AtomicLongFieldUpdater原子類(lèi)的相關(guān)知識(shí),感興趣的朋友一起看看吧2017-06-06
Spring Boot 自定義 Shiro 過(guò)濾器無(wú)法使用 @Autowired問(wèn)題及解決方法
這篇文章主要介紹了Spring Boot 自定義 Shiro 過(guò)濾器無(wú)法使用 @Autowired問(wèn)題及解決方法 ,本文給大家介紹的非常詳細(xì),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2019-06-06
Mybatis實(shí)現(xiàn)增刪改查(CRUD)實(shí)例代碼
MyBatis 是支持普通 SQL 查詢(xún),存儲(chǔ)過(guò)程和高級(jí)映射的優(yōu)秀持久層框架。通過(guò)本文給大家介紹Mybatis實(shí)現(xiàn)增刪改查(CRUD)實(shí)例代碼 ,需要的朋友參考下2016-05-05
詳解java實(shí)現(xiàn)簡(jiǎn)單掃碼登錄功能(模仿微信網(wǎng)頁(yè)版掃碼)
這篇文章主要介紹了java實(shí)現(xiàn)簡(jiǎn)單掃碼登錄功能(模仿微信網(wǎng)頁(yè)版掃碼),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2019-05-05
聊聊@value注解和@ConfigurationProperties注解的使用
這篇文章主要介紹了@value注解和@ConfigurationProperties注解的使用,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2021-09-09
Spring?Cloud?Gateway動(dòng)態(tài)路由Apollo實(shí)現(xiàn)詳解
這篇文章主要為大家介紹了Spring?Cloud?Gateway動(dòng)態(tài)路由通過(guò)Apollo實(shí)現(xiàn)示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-10-10
idea springboot 修改css,jsp不重啟實(shí)現(xiàn)頁(yè)面更新的問(wèn)題
這篇文章主要介紹了idea springboot 修改css,jsp不重啟實(shí)現(xiàn)頁(yè)面更新的問(wèn)題,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2020-10-10

