作者dream1124 (全新開始)
看板java
標題Re: [問題] thread run VS start
時間Tue Nov 19 08:25:16 2013
※ 引述《togs (= =")》之銘言:
: 之前寫的程式不斷出錯,上網查才大略知道thread 的run和start差異
: 在網路上看到的講義,
: 講義裡做出label(圖片)移動的方式是用thread.start();
: 但當我將thread放在method裡頭時,例如:
: static void voidTestInVoid(){
: System.out.println("voidTestInVoid beginning");
: thread = new addThread1("abc"); //print出abc
: thread.start();
: thread = new addThread1("cde");
: thread.start();
: System.out.println("voidTestInVoid end");
: }
: 我發現在執行 voidTestInVoid(); 時
: 每次執行print出來的文字順序都會不一樣,特別是不會從上而下照順序執行
你知道 thread 是什麼東西嗎? 這是執行緒
你呼叫 start 的時候,jvm會幫你開一個執行緒,
在新的執行緒執行 thread 裡面 run 方法的內容。
呼叫 run 的話就只是在原本的執行緒執行一個很普通的方法。
就結果而言,為了強化效能,
jvm 本來就不保證跨執行緒的程式在編譯成byte code 之後
彼此之間有什麼固定的執行順序,
而在同一個執行緒的程式則有一定的先後順序關係,
因此呈現在同一個命令列裡面的文字順序每次都不一樣是很正常的。
先去了解一下執行緒的觀念,你就不會有我刪掉的後面這些問題
--
※ 發信站: 批踢踢實業坊(ptt.cc)
◆ From: 118.168.65.88
推 togs:感謝,您解釋地相當清楚:) 我確實沒將thread搞懂 受教了:) 11/19 10:13
→ PsMonkey:是 multi-thread 本身的特性,跟 JVM 與否應該無關 11/19 10:43
多執行緒函式庫的實作都有規格,就算有慣例的做法,
但規格沒限制的地方,沒有什麼是「天性如此」的。
我相信願意找的話一定會有某個 jvm 實作執行他的程式以後,
在命令列的輸出結果符合他原本的預期,但我要強調不管哪一種輸出結果都不用意外
→ Killercat:run()只是單純的去call run()裡面的程式碼而已 11/19 10:52
→ Killercat:跟你隨便做一個class跑裡面的method一樣 這樣比較好懂? 11/19 10:56
※ 編輯: dream1124 來自: 118.168.124.48 (11/19 19:20)
推 togs:相當好懂:) many thanks^^ 11/20 06:50
推 ah7675:繷W格有什麼關係? 是scheduling 還有context switch 11/24 01:22
→ ah7675:規格 11/24 01:23