SORU
31 Mart 2009, Salı


Nasıl diğer konuları bitirmiş bilmek?

Bir yöntem StartDownload adında bir nesne var(), bu üç iş parçacığı başlar. Nasıl her iş parçacığı yürütme tamamlandığında bir bildirim alacak mıyım?

Bir şekilde bir (veya tüm) konuları bitti hala yürütülüyorsa bilmek var mı?

CEVAP
31 Mart 2009, Salı


Bu yapabileceğiniz bir kaç yolu vardır:

  1. Her iş Parçacığı tamamlamak için engelleyici bir şekilde beklemek için ana konuyu kullanın Thread.join() ya
  2. Onay genellikle cesareti -- her iş Parçacığı tamamlanıncaya kadar bekleyin, ya da . Thread.isAlive() yoklama bir şekilde --
  3. Her konu için soru, setUncaughtExceptionHandler nesnesinin bir yöntemini çağırmak için, ve her iş Parçacığı tamamlandığında yakalanmamış bir İstisna atmak için program arama, alışılmışın dışında ya
  4. java.util.concurrent, ya kilitler ya da eşitleyici veya mekanizmaları kullanın
  5. Daha fazla Ortodoks, ana konuya bir dinleyici oluşturun ve sonra da Konuları her programı tamamlandı oldukları dinleyici anlatmak için.

Nasıl uygulamak Fikir #5? Mesela ilk bir arabirim oluşturmak için:

public interface ThreadCompleteListener {
    void notifyOfThreadComplete(final Thread thread);
}

aşağıdaki sınıfı oluşturun:

public abstract class NotifyingThread extends Thread {
  private final Set<ThreadCompleteListener> listeners
                   = new CopyOnWriteArraySet<ThreadCompleteListener>();
  public final void addListener(final ThreadCompleteListener listener) {
    listeners.add(listener);
  }
  public final void removeListener(final ThreadCompleteListener listener) {
    listeners.remove(listener);
  }
  private final void notifyListeners() {
    for (ThreadCompleteListener listener : listeners) {
      listener.notifyOfThreadComplete(this);
    }
  }
  @Override
  public final void run() {
    try {
      doRun();
    } finally {
      notifyListeners();
    }
  }
  public abstract void doRun();
}

ve sonra Konuları her NotifyingThread doRun() uygulamak. run() uygulamak yerine uzatacaktır. Böylece onlar tamamlandığında, Otomatik olarak herkesten bildirim bekliyorum haber verecekler.

Nihayet, ana sınıfı -- başlayan tüm iş Parçacıkları (ya da en azından nesne bekliyorum bildirim) -- değiştiren sınıf implement ThreadCompleteListener ve hemen sonra her iş Parçacığı oluşturma eklemek kendisine listenin dinleyiciler:

NotifyingThread thread1 = new OneOfYourThreads();
thread1.addListener(this); // add ourselves as a listener
thread1.start();           // Start the Thread

daha sonra, her iş Parçacığı çıkar gibi notifyOfThreadComplete yöntem sadece tamamlandı İplik örneği (veya kaza) ile çağrılır.

İyi uzanan İplik genellikle yeni kod önerilmez NotifyingThread extends Thread yerine implements Runnable olacağını unutmayın. Ama sorunuza kodlama yapıyorum. Eğer Runnable uygulamak NotifyingThread sınıfı değiştirirseniz o zaman oldukça basit yapmak için hangi Konuları yöneten kodunuzu, bazı değiştirmek zorunda.

Bunu Paylaş:
  • Google+
  • E-Posta
Etiketler:

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • Kevin Bruckert

    Kevin Brucke

    30 Aralık 2006
  • Ty Moss

    Ty Moss

    20 Kasım 2007
  • Video Copilot

    Video Copilo

    21 EYLÜL 2006