為啥呼叫new Thread().start()方法會呼叫run()方法?
為啥呼叫new Thread().start()方法會呼叫run()方法?
我們看原始碼:
public synchronized void start() {
/**
* This method is not invoked for the main method thread or "system"
* group threads created/set up by the VM. Any new functionality added
* to this method in the future may have to also be added to the VM.
*
* A zero status value corresponds to state "NEW".
*/
if (threadStatus != 0)
throw new IllegalThreadStateException();
/* Notify the group that this thread is about to be started
* so that it can be added to the group's list of threads
* and the group's unstarted count can be decremented. */
group.add(this);
boolean started = false;
try {
start0();
started = true;
} finally {
try {
if (!started) {
group.threadStartFailed(this);
}
} catch (Throwable ignore) {
/* do nothing. If start0 threw a Throwable then
it will be passed up the call stack */
}
}
}
我一開始以為原始碼會有一句呼叫run方法的程式碼,結果沒有發現。然後在方法的doc裡我們可以看見:
/**
* Causes this thread to begin execution; the Java Virtual Machine
* calls the <code>run</code> method of this thread.
* <p>
* The result is that two threads are running concurrently: the
* current thread (which returns from the call to the
* <code>start</code> method) and the other thread (which executes its
* <code>run</code> method).
* <p>
* It is never legal to start a thread more than once.
* In particular, a thread may not be restarted once it has completed
* execution.
* 呼叫start方法使此執行緒開始執行;Java虛擬機器呼叫此執行緒的run方法。兩個執行緒併發執行:當前執行緒(呼叫start的執行緒)和另一個執行緒(執行run方法的執行緒)
* 多次啟動執行緒是不合法的。
* 特別地,執行緒一旦完成,可能就不會重新啟動執行。
*
* @exception IllegalThreadStateException if the thread was already
* started.
* @see #run()
* @see #stop()
*/
public synchronized void start()
原因就是:
呼叫start方法使此執行緒開始執行;
Java虛擬機器呼叫此執行緒的run方法。
兩個執行緒併發執行:當前執行緒(呼叫start的執行緒)和另一個執行緒(執行run方法的執行緒)
也就是說如果直接呼叫run方法,則是當前執行緒呼叫run方法,而不是jvm去建立新執行緒呼叫。
再看看run方法:
@Override
public void run() {
if (target != null) {
target.run();
}
}
這裡的target就是平時new Thread();傳遞的引數:
new Thread(Runnable target);
相關文章
- JNI-Thread中start方法的呼叫與run方法的回撥分析thread
- Java中多執行緒啟動,為什麼呼叫的是start方法,而不是run方法?Java執行緒
- Thread中run和start方法的模板設計模式thread設計模式
- 微服務間的方法呼叫和應用內方法呼叫有啥區別微服務
- java面試題之Thread的run()和start()方法有什麼區別Java面試題thread
- Tomcat 7 啟動分析(四)各元件 init、start 方法呼叫Tomcat元件
- Runloop & 方法呼叫OOP
- c# 反射呼叫方法C#反射
- Java 非同步呼叫方法Java非同步
- Mac android呼叫ffmpeg 方法MacAndroid
- js和vue方法的相互呼叫(iframe父子頁面的方法相互呼叫)。JSVue
- Java方法02:方法的定義和呼叫Java
- 呼叫JavaCalls::call()方法來執行Java方法Java
- JVM如何處理方法呼叫JVM
- vue 父子元件的方法呼叫Vue元件
- JVM系列-方法呼叫的原理JVM
- C#呼叫python的方法C#Python
- php 呼叫dll 裡面的方法PHP
- Java基礎——方法的呼叫Java
- CefSharp ——js呼叫c#方法JSC#
- java呼叫不了你本以為有的方法的問題Java
- 為什麼基本型別可以呼叫方法——以字串為例型別字串
- Service呼叫其他Service的private方法, @Transactional會生效嗎(上)
- JavaScript如何呼叫Native iOS/Android 方法JavaScriptiOSAndroid
- 間隔呼叫方法(setInterval與setTimeout)
- Stable-diffusion WebUI API呼叫方法WebUIAPI
- C#呼叫js庫的方法C#JS
- Laravel 使用依賴注入呼叫方法Laravel依賴注入
- 基本方法的呼叫與過載
- go物件導向方法的呼叫Go物件
- +load和+initialize方法呼叫時機
- Spring雜談 | 從橋接方法到JVM方法呼叫Spring橋接JVM
- Java 方法中迴圈呼叫具有事務的方法Java
- java是如何呼叫native方法?hotspot原始碼分析必會技能JavaHotSpot原始碼
- 解決new Thread().Start導致高併發CPU 100%的問題thread
- 被標記為事務的方法互相呼叫的坑(下)
- 被標記為事務的方法互相呼叫的坑(上)
- JavaScript 數字呼叫方法或者屬性JavaScript