為啥呼叫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
- 利用new Exception() getStackTrace()檢視誰呼叫了方法Exception
- Thread的run()與start()的區別thread
- Runloop & 方法呼叫OOP
- Tomcat 7 啟動分析(四)各元件 init、start 方法呼叫Tomcat元件
- restfulwebservice 呼叫方法 getRESTWeb
- js 呼叫 WebService 方法JSWeb
- java 方法呼叫繫結Java
- c# 反射呼叫方法C#反射
- Java 非同步呼叫方法Java非同步
- Thead物件的sleep方法,和yield方法有何區別,為什麼實現的執行緒中,在run方法中要呼叫sleep方法?物件執行緒
- js和vue方法的相互呼叫(iframe父子頁面的方法相互呼叫)。JSVue
- Java方法02:方法的定義和呼叫Java
- JVM系列-方法呼叫的原理JVM
- vue 父子元件的方法呼叫Vue元件
- JVM如何處理方法呼叫JVM
- Mac android呼叫ffmpeg 方法MacAndroid
- Java基礎——方法的呼叫Java
- thinkphp 3.2 redis memcache 呼叫方法PHPRedis
- 前端框架iframe相互呼叫方法前端框架
- java對過反射呼叫方法Java反射
- php 呼叫dll 裡面的方法PHP
- java呼叫不了你本以為有的方法的問題Java
- 為什麼基本型別可以呼叫方法——以字串為例型別字串
- 呼叫JavaCalls::call()方法來執行Java方法Java
- New start new hope!
- jfinal系統啟動時呼叫的方法和系統停止時呼叫的方法
- Laravel 使用依賴注入呼叫方法Laravel依賴注入
- CefSharp ——js呼叫c#方法JSC#
- go物件導向方法的呼叫Go物件
- Stable-diffusion WebUI API呼叫方法WebUIAPI
- JS_建立物件+呼叫物件方法JS物件
- collectionView不能呼叫didSelected方法View
- php呼叫webservice的幾種方法PHPWeb