SORU
8 EKİM 2008, ÇARŞAMBA


CountDownLatch vs Semafor

java.util.concurrent.Semaphore yerine java.util.concurrent.CountdownLatch kullanmanın bir avantajı var mı? Aşağıdaki parçaları söyleyebileceğim kadarıyla neredeyse eşdeğer:

1:

final Semaphore sem = new Semaphore(0);
for (int i = 0; i < num_threads;    i)
{
  Thread t = new Thread() {
    public void run()
    {
      try
      {
        doStuff();
      }
      finally
      {
        sem.release();
      }
    }
  };
  t.start();
}

sem.acquire(num_threads);

2:

final CountDownLatch latch = new CountDownLatch(num_threads);
for (int i = 0; i < num_threads;    i)
{
  Thread t = new Thread() {
    public void run()
    {
      try
      {
        doStuff();
      }
      finally
      {
        latch.countDown();
      }
    }
  };
  t.start();
}

latch.await();

DAVA AÇAMAZSINIZ mandal #2 yeniden ve daha da önemlisi kaç oluşturulur önceden bilmek gerekir (ya da mandal oluşturmadan önce başladı tamamen bitene kadar bekleyin.) hariç

Yani ne durum mandalı tercih olabilir?

CEVAP
8 EKİM 2008, ÇARŞAMBA


Geri sayım sık sık örnek tam tersi için kullanılan mandal. Genel olarak, çok iş parçacığı engelleme olurdu "() bekliyor" countown sıfıra ulaştığında aynı anda başlamak istiyorum.

final CountDownLatch countdown = new CountDownLatch(1);
for (int i = 0; i < 10;    i){
   Thread racecar = new Thread() {    
      public void run()    {
         countdown.await(); //all threads waiting
         System.out.println("Vroom!");
      }
   };
   racecar.start();
}
System.out.println("Go");
countdown.countDown();   //all threads start now!

Ayrıca MPI tarzı "" tüm iş parçacığı başka bir iş parçacığı için Devam etmeden önce belli bir noktaya yetişmek için beklemek neden olan bir engel olarak bunu kullanabilirsin

final CountDownLatch countdown = new CountDownLatch(num_thread);
for (int i = 0; i < num_thread;    i){
   Thread t= new Thread() {    
      public void run()    {
         doSomething();
         countdown.countDown();
         System.out.printf("Waiting on %d other threads.",countdown.getCount());
         countdown.await();     //waits until everyone reaches this point
         finish();
      }
   };
   t.start();
}

Hepsi bu kadar, geri Sayım güvenle örnekte gösterdiğin şekilde kullanılabilir mandal söyledi.

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

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • Bigapplemagic

    Bigapplemagi

    22 EYLÜL 2011
  • joshsnice

    joshsnice

    28 Kasım 2006
  • Numberphile

    Numberphile

    15 EYLÜL 2011