伊莉討論區

標題: [以解決]請益執行緒的問題 [打印本頁]

作者: 19821206    時間: 2009-3-31 12:06 AM     標題: [以解決]請益執行緒的問題

本帖最後由 19821206 於 2009-4-8 10:45 PM 編輯

請問執行緒不是應該是再同一個時間點只有一個執行緒可以執行

結束完才會換執行下一個

那為什麼以下的程式Show出來的結果會是交錯的呢?
  1. class A extends Thread{
  2.     int i;
  3.     private String name;
  4.     public A(String name){
  5.         this.name=name;
  6.     }
  7.     public void run(){
  8.         i=0;
  9.         while(true){
  10.             System.out.println(name+" : "+i++);
  11.             if(i==10){
  12.                 break;
  13.             }
  14.         }
  15.     }
  16. }
  17. public class Test {
  18.     public static void main(String[] args) {
  19.         A a=new A("a");
  20.         A a1=new A("a1");
  21.         a1.start();
  22.         a.start();
  23.     }
  24. }
複製代碼
執行的結果為

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 語法呢?

  1.     A a1=new A("A1");
  2.     A a2=new A("A2");
  3.    
  4.     a1.start();
  5.     a2.start();
  6.    
  7.     try{
  8.       a2.join();
  9.     }catch(InterruptedException e){}
複製代碼


這樣子的寫法是正確的嗎?

我想要如果執行到a2.join,就先把a2全部執行完,在執行剩餘a1的部份

可是我在執行時,發現a1 跟 a2還是有穿插耶?
作者: yyyyman    時間: 2009-4-5 11:21 PM

join...有點忘記了,似乎是當現行的執行緒結束時能接在其後跑吧
太久了,有點忘....有請高手囉....




歡迎光臨 伊莉討論區 (http://www97.eyny.com/) Powered by Discuz!