2016-03-21 18 views
-1

anlamıyorum yöntemiyle rağmen katılmak yürütme değildir:Konu bu kodu için bu çıktıyı almak Oldukça neden

public class Example { 

    static void threadMessage(String message) { 
     String threadName = 
      Thread.currentThread().getName(); 
     System.out.format("%s: %s%n", threadName, message); 
    } 

    private static class MessageLoop implements Runnable { 
     public void run() { 
      String importantInfo[] = { 
       "Line 1", 
       "Line 2", 
       "Line 3", 
       "Line 4" 
      }; 
      try { 
       for (int i = 0; i< importantInfo.length; i++) { 
        // Pause for 4 seconds 
        Thread.sleep(4000); 
        // Print a message 
        threadMessage(importantInfo[i]); 
       } 
      } catch (InterruptedException e) { 
       ; 
      } 
     } 
    } 

    public static void main(String args[]) throws InterruptedException { 


     threadMessage("Starting MessageLoop thread"); 
     Thread t = new Thread(new MessageLoop()); 
     t.start(); 

     threadMessage("Waiting for MessageLoop thread to finish"); 

     while (t.isAlive()) { 
      threadMessage("Still waiting..."); 
      // Wait maximum of 1 second 
      // for MessageLoop thread 
      // to finish. 
      t.join(1000); 
     } 
     threadMessage("Finally!"); 
    } 
} 

Çıktı:

 
main: Starting MessageLoop thread 
main: Waiting for MessageLoop thread to finish 
main: Still waiting... 
main: Still waiting... 
main: Still waiting... 
main: Still waiting... 
main: Still waiting... 
Thread-0: Line 1 
main: Still waiting... 
main: Still waiting... 
main: Still waiting... 
main: Still waiting... 
Thread-0: Line 2 
main: Still waiting... 
main: Still waiting... 
main: Still waiting... 
Thread-0: Line 3 
main: Still waiting... 
main: Still waiting... 
main: Still waiting... 
main: Still waiting... 
Thread-0: Line 4 
main: Finally! 

içimde bu açıklamayı yazarsanız döngü, iş parçacığı ana yürütme ile devam eder. Bu iş parçacığının, iş parçacığı bittikten sonra yürütmeye devam etmesi gerekmiyor mu?

t.join (1000); Bununla birlikte, bucle çalışmasını sürdürmektedir. iken (t.isAlive()) - - Bildiğim kadarıyla bu 2 satır ana iplik aittir threadMessage ("Hala bekliyor ...")

Bu bağlantıyı bir örneğini anlamaya çalışıyorum:

Java tutorial

Yardımlarınız için şimdiden teşekkür ederiz!

+1

? Hangi çıktıyı beklerdiniz ve neden? –

cevap

2

join() yöntemine ve belgelerine here numaralı telefondan ulaşabilirsiniz. Bu ne diyor:

Bu iş parçacığının ölmesi için en çok milisaniye olarak bekler.

Sen join() için 1000 geçiyoruz, yani, ana iş parçacığı bakılmaksızın thread t tam olduğunu, devam etmeden önce, en fazla 1 saniye bekler. İş parçacığı t, 4 saniye uyku zaman aşımına sahiptir ve bu nedenle, ana iş parçacığı her zaman t (katılma zamanlamasının ardından) tamamlanmadan tamamlanır.

Ana iş parçacığının sonsuza dek beklemesini istiyorsanız, join()'u (yani, bağımsız değişken kullanmadan) kullanmanız gerekir.

+0

Mükemmel, bu bana açıktı. Teşekkürler!!! – William

1
while (t.isAlive()) { 
    threadMessage("Still waiting..."); 
    // Wait maximum of 1 second 
    // for MessageLoop thread 
    // to finish. 
    t.join(1000); 
} 

t.join(1000) bekler ölmek iplik t 1000 milisaniye anlamına gelir. Tüm satırları yazdırıncaya kadar t ölmeyecek. Senaryo, her saniye t.join(1000) zaman aşımıdır ve t hala canlıdır (çünkü her seferinde bir satır yazdırıldığında 4 saniye uyur). join(1000) süresi sona erdi ve t.isAlive() nedenle ana iş parçacığı parçacığının t görevini tamamladığında, t.isAlive() yanlış olacaktır .. Still waiting çıktısını olur ve while döngüsü sonra yazdırmak kırar, doğrudur çıktıda anlamadığın şey Finally