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

  • Dave Wallace

    Dave Wallace

    27 Kasım 2007
  • Eric Enge

    Eric Enge

    2 Kasım 2009
  • TheMasterOfHell100

    TheMasterOfH

    13 AĞUSTOS 2011