2010-11-23 20 views
12

Çok iş parçacıklı bir java programında, bir iş parçacığı nesnesi T başlatılmışsa ve daha sonra iş parçacığı başlatılmadan önce T.join() çağrılırsa ne olur? Başka bir iş parçacığının, başka bir iş parçacığının T.join() çağırmasından önce veya sonra, T'nin başlatılmasından sonra herhangi bir zamanda T.start() öğesini çağırabileceğini varsayalım. Ben T.join() T.start (daha önce adı olmuştur bir sorun olduğunu düşünüyorum çünküHedef henüz başlamamışsa, Thread.join() öğesinin Java'daki davranışı nedir?

I) soruyorum ve T.join çağıran iş parçacığı() kapatır.

Evet, ben, sabit, bu olmayan bir konu yapabilir bazı tasarım sorunları var biliyorum. Ancak, join() davranışının özelliklerini bilmek isterim çünkü Java API'sı doktorlarının söylediği tek şey "Bu iş parçacığının ölmesini bekler."

+1

Bunu deneyin. Başka bir basit proje yapın ve neler olduğunu görün. – BeemerGuy

+3

BeemerGuy: Belki de, bir noktada. Bununla birlikte, sadece deneme yanılmalarının, sahnelerin ardında neler olup bittiğini tam olarak aydınlatacağından emin değilim. Her zaman başka birinin bildiği bir şans var ve bana zaman kazandırabilir. – DGH

cevap

11

Sadece dönecektir. Aşağıdaki kodlara bakın - iş parçacığı başlamadan önce isAlive() yanlış olacaktır, bu nedenle hiçbir şey olmayacaktır.

public final synchronized void join(long millis) 
    throws InterruptedException { 
    long base = System.currentTimeMillis(); 
    long now = 0; 

    if (millis < 0) { 
      throw new IllegalArgumentException("timeout value is negative"); 
    } 

    if (millis == 0) { 
     while (isAlive()) { 
     wait(0); 
     } 
    } else { 
     while (isAlive()) { 
     long delay = millis - now; 
     if (delay <= 0) { 
      break; 
     } 
     wait(delay); 
     now = System.currentTimeMillis() - base; 
     } 
    } 
    } 

kod parçacığı © Telif Oracle 2006 ve/veya bağlı kuruluşları, ve found here olabilir. Java Research License altında lisanslanmıştır.

+0

Burada yapıştırdığınız şey birleştirme (uzun öğütücüler). Join() hakkında ne dersiniz? Davranışların her iki yöntem için de aynı olduğunu düşünmüyorum. – DGH

+0

@DGH: join() çağrılar birleştirir (0). –

+0

@Nathan Hughes: Tamam, bunu açıklıyor, teşekkürler. – DGH

-1

İş parçacığının bitmesi için süresiz olarak beklemelisiniz ... bu da sizin durumunuzda asla anlayamadığım kadarıyla gerçekleşmez.

İlgili konular