伊莉討論區
標題:
[以解決]請益執行緒的問題
[打印本頁]
作者:
19821206
時間:
2009-3-31 12:06 AM
標題:
[以解決]請益執行緒的問題
本帖最後由 19821206 於 2009-4-8 10:45 PM 編輯
請問執行緒不是應該是再同一個時間點只有一個執行緒可以執行
結束完才會換執行下一個
那為什麼以下的程式Show出來的結果會是交錯的呢?
class A extends Thread{
int i;
private String name;
public A(String name){
this.name=name;
}
public void run(){
i=0;
while(true){
System.out.println(name+" : "+i++);
if(i==10){
break;
}
}
}
}
public class Test {
public static void main(String[] args) {
A a=new A("a");
A a1=new A("a1");
a1.start();
a.start();
}
}
複製代碼
執行的結果為
a : 0
a1 : 0
a1 : 1
a1 : 2
a1 : 3
a1 : 4
a1 : 5
a1 : 6
a1 : 7
a1 : 8
a1 : 9
a : 1
a : 2
a : 3
a : 4
a : 5
a : 6
a : 7
a : 8
a : 9
為什麼a還沒有執行完,a1這個執行緒就插進來了呢?
作者:
magic99
時間:
2009-4-1 12:03 AM
因為(同一個時間點只有一個執行緒可以執行)
且現在執行那一個Thread不是你程式可以控制的,由OS控制但可以設定Priority那個Thread優先執行
所以你的Thread才會交錯,並不是先執行先跑完,找本書K一下Thread吧,不熟的話寫Thread是很危險的結果可能不是你想的
作者:
game1meat
時間:
2009-4-1 01:38 AM
沒錯 同一時間點只能一個Thread執行
但是CPU運算很快 所以你會感覺是交錯的
因為每個Thread執行會去搶優先權
所以有可能a Thread還沒執行完 a1 又執行
但不管如何 Thread還是會執行完
作者:
19821206
時間:
2009-4-1 01:38 PM
本帖最後由 19821206 於 2009-4-1 02:44 PM 編輯
那在請教一下,我該如何正確的使用 join 語法呢?
A a1=new A("A1");
A a2=new A("A2");
a1.start();
a2.start();
try{
a2.join();
}catch(InterruptedException e){}
複製代碼
這樣子的寫法是正確的嗎?
我想要如果執行到a2.join,就先把a2全部執行完,在執行剩餘a1的部份
可是我在執行時,發現a1 跟 a2還是有穿插耶?
作者:
yyyyman
時間:
2009-4-5 11:21 PM
join...有點忘記了,似乎是當現行的執行緒結束時能接在其後跑吧
太久了,有點忘....有請高手囉....
歡迎光臨 伊莉討論區 (http://www97.eyny.com/)
Powered by Discuz!