Ⅰ java thread start 方法會立即執行嗎
樓主:
在Java中是這樣的,當你創建了一個線程,並調用了start方法,則該線程會開始執行,即立即執行。
API說明如下:
public void start()
使該線程開始執行;Java 虛擬機調用該線程的 run 方法。
結果是兩個線程並發地運行;當前線程(從調用返回給 start 方法)和另一個線程(執行其 run
方法)。多次啟動一個線程是非法的。特別是當線程已經結束執行後,不能再重新啟動。
有問題歡迎提問,滿意請採納,謝謝!
Ⅱ java中Thread.start()和Thread.run()有什麼區別
run()方法,用於封裝線程運行的任務代碼。直接用創建的線程對象調用,
並沒有產生新的線程,僅僅是當前正在運行的線程(如,主線程)在執行run方法.
start()方法,共有兩個作用,1,開啟了當前線程,也就是說,
當前程序又多了一條執行路徑和當前線程(主線程)並發執行。
而run()方法會被新開啟的線程運行。2,調用線程的run()方法。
Ⅲ Java的Thread類中start是如何調用到run()的我看jdk源碼里start只是調了本地方法start0,而start0中沒有
就是通過native start0再調用到的啊,只不過代碼你看不到。
之所以要用native方法,是因為再往下不同平台就不一樣了,java以高可移植性為目標,實際上是把平台相關的內容隱藏在jvm里。
而線程的啟動,運行,生命期管理,調度這些內容都是高度平台相關的,只能通過native方法來實現,無法用java層面來實現。
具體來說,start0調用通過native interface的方式傳到c++實現的native庫中,在windows上是jvm dll,在linux上是so。
在native庫中,接受了線程對象的句柄,創建一個線程,這個線程就是依賴操作系統強相關的了,線程啟動後運行一段線程體函數,在線程體中的某個位置,再透過native interface返回來調用你的run方法。
你可以去下載一些開源jdk實現的jvm庫,去看看c++層面如何實現,以滿足你的好奇心
Ⅳ java thread.start是線程開始 怎麼關閉線程呢
1. 使用退出標志,使線程正常退出,也就是當run方法完成後線程終止。
2. 使用stop方法強行終止線程(這個方法不推薦使用,因為stop和suspend、resume一樣,也可能發生不可預料的結果)。
3. 使用interrupt方法中斷線程。
Ⅳ JAVA 中thread的run和start方法有什麼區別
1.start()方法來啟動線程,真正實現了多線程運行,這時無需等待run方法體代碼執行完畢而直接繼續執行下面的代碼:
通過調用Thread類的start()方法來啟動一個線程,
這時此線程是處於就緒狀態,
並沒有運行。
然後通過此Thread類調用方法run()來完成其運行操作的,
這里方法run()稱為線程體,
它包含了要執行的這個線程的內容,
Run方法運行結束,
此線程終止,
而CPU再運行其它線程,
2.run()方法當作普通方法的方式調用,程序還是要順序執行,還是要等待run方法體執行完畢後才可繼續執行下面的代碼:
而如果直接用Run方法,
這只是調用一個方法而已,
程序中依然只有主線程--這一個線程,
其程序執行路徑還是只有一條,
這樣就沒有達到寫線程的目的。
舉例說明一下:
記住:線程就是為了更好地利用CPU,
提高程序運行速率的!
public class TestThread1{
public static void main(String[] args){
Runner1 r=new Runner1();
//r.run();//這是方法調用,而不是開啟一個線程
Thread t=new Thread(r);//調用了Thread(Runnable target)方法。且父類對象變數指向子類對象。
t.start();
for(int i=0;i<100;i++){
System.out.println("進入Main Thread運行狀態");
System.out.println(i);
}
}
}
class Runner1 implements Runnable{ //實現了這個介面,jdk就知道這個類是一個線程
public void run(){
for(int i=0;i<100;i++){
System.out.println("進入Runner1運行狀態");
System.out.println(i);
}
}
}
Ⅵ java thread 結束後 可以再次次 start 么
1.start()方法來啟動線程,真正實現了多線程運行,這時無需等待run方法體代碼執行完畢而直接繼續執行下面的代碼:通過調用Thread類的start()方法來啟動一個線程,這時此線程是處於就緒狀態,並沒有運行。然後通過此Thread類調用方法run()來完成其運行操作的,這里方法run()稱為線程體,它包含了要執行的這個線程的內容,Run方法運行結束,此線程終止,而CPU再運行其它線程,2.run()方法當作普通方法的方式調用,程序還是要順序執行,還是要等待run方法體執行完畢後才可繼續執行下面的代碼:而如果直接用Run方法,這只是調用一個方法而已,程序中依然只有主線程--這一個線程,其程序執行路徑還是只有一條,這樣就沒有達到寫線程的目的。Thread對象的run()方法在一種循環下,使線程一直運行,直到不滿足條件為止,在你的main()里創建並運行了一些線程,調用Thread類的start()方法將為線程執行特殊的初始化的過程,來配置線程,然後由線程執行機制調用run()。如果你不調用start()線程就不會啟動。因為線程調度機制的行為是不確定的,所以每次運行該程序都會有不同的結果,你可以把你的循環次數增多些,然後看看執行的結果,你會發現main()的線程和Thread1是交替運行的。4.還有就是盡管線程的調度順序是不固定的,但是如果有很多線程被阻塞等待運行,調度程序將會讓優先順序高的線程先執行,而優先順序低的線程執行的頻率會低一些。
Ⅶ java中thread的start和run的區別
java中thread的start()方法和run()方法的區別:
t.start(); 該行代碼相當於是啟動線程,
t.run(); 該行代碼相當於是使用t這個類中的run方法而已。
Ⅷ java中thread線程start和run的區別
start(): 它的作用是啟動一個新線程,新線程會執行相應的run()方法。start()不能被重復調用。
run() : run()就和普通的成員方法一樣,可以被重復調用。單獨調用run()的話,會在當前線程中執行run(),而並不會啟動新線程!
start()的源碼
Ⅸ java中thread的start()和run()有何區別
1、start()方法來啟動線程,真正實現了多線程運行,這時無需等待。
run方法體代碼執行完畢而直接繼續執行下面的代碼;通過調用Thread類的start()方法來啟動一個線程,這時此線程是處於就緒狀態,並沒有運行。
通過Thread類調用方法run()來完成其運行操作的,這里方法run()稱為線程體,它包含了要執行的這個線程的內容,Run方法運行結束,此線程終止,而CPU再運行其它線程。
2、run()方法當作普通方法的方式調用,程序還是要順序執行,還是要等待run方法體執行完畢後才可繼續執行下面的代碼;
而如果直接用run方法,這只是調用一個方法而已,程序中依然只有主線程--這一個線程,其程序執行路徑還是只有一條,這樣就沒有達到寫線程的目的。
3、調用start方法方可啟動線程,而run方法只是thread的一個普通方法調用,還是在主線程里執行。
4、這兩個方法需要把並行處理的代碼放在run()方法中,start()方法啟動線程將自動調用 run()方法,這是由jvm的內存機制規定的。並且run()方法必須是public訪問許可權,返回值類型為void.。
(9)javathreadstart擴展閱讀:
用start方法來啟動線程,真正實現了多線程運行,這時無需等待run方法體代碼執行完畢而直接繼續執行下面的代碼。
通過調用Thread類的start()方法來啟動一個線程,這時此線程處於就緒(可運行)狀態,並沒有運行,一旦得到cpu時間片,就開始執行run()方法,這里方法 run()稱為線程體,它包含了要執行的這個線程的內容,Run方法運行結束,此線程隨即終止。
run()方法只是類的一個普通方法而已,如果直接調用Run方法,程序中依然只有主線程這一個線程,其程序執行路徑還是只有一條,還是要順序執行,還是要等待run方法體執行完畢後才可繼續執行下面的代碼,這樣就沒有達到寫線程的目的。