23 Ekim 2016 Pazar

Eşzamanlılık Yapıları

CyclicBarrier
Bu sınıf tüm thread'lerin aynı noktada buluşmasını sağlar.Şu satırı dahil ederiz. Detaylı bir kullanım örneği için buraya bakınız.
import java.util.concurrent.CyclicBarrier;
Bu sınıf ve CountdownLatch çok benziyorlar. Aralarında bazı farklar var. CyclicBarrier daha karmaşık işler için kullanılır.

1. CyclicBarrier sayma işlemi bitince çalıştırmak üzere bir Runnable alabilir.
2. Barrier reset'lenip tekrar kullanılabilir.
3. CyclicBarrier nesnesinin await() metodu farklı thread'ler tarafından çağrılmalıdır. CountdownLatch için countDown() metodu aynı thread tarafından arka arkaya çağrılsa bile sorun olmaz.

constructor
Şöyle yaparız.
CyclicBarrier barrier = new CyclicBarrier(3); 
await
Thread içinde çağrılır. Diğer thread'lerin de aynı satıra gelmesini bekler. Nesnenin isminde cyclic olmasından anlaşılacağı gibi son thread de await'i çağırığ sayaç 0 olduktan sonra otomatik olarak tekrar 3 değerini alır.
barrier.await(); //Barrier automatically resets.
CountdownLatch 
CountdownLatch ve semaphor ilk bakışta iki yapı da birbirlerine benziyor gibi görünüyor ancak farklı işlere yarıyorlar. Semaphore serbest olan kaynakları sayan bir sayaç. CountdownLatch thread'lerin buluşma noktası olarak kullanılıyor. CountdownLatch isminden de anlaşıldığı gibi sadece geriye sayım yapan (tek yönlü) bir sayaç. Örnek:
// First initialize latch with your number of threads
 CountDownLatch latch = new CountDownLatch(N);

 // Then give this instance of latch to each of your threads

 // and finally at your checkpoint do
 latch.countDown();
 latch.await(); 
CountDownLatch basitçe şöyle de gerçekleştirilebilirdi.
Integer threadCount = 10;

for (int i = 0; i < threadCount; i++)
{
    new Thread(() ->
    {
        try
        {
            doFirst();
            synchronized (threadCount)
            {
                threadCount--;
                while (threadCount > 0)
                    threadCount.wait();
                threadCount.notifyAll();
            }
            doSecond();
        }
        catch (Exception e) { e.printStackTrace(); }
    }).start();
}
Semaphore ise hem aşağı hem de yukarı oynayabilen (çift yönlü) bir sayaç.

CountDownLatch vs. Semaphore sorusu da göz atmaya değer.

constructor metodu
Sayacı ilklendirir.
CountDownLatch latch = new CountDownLatch(1);
coundDown metodu
Thread içinde çağrılır. Sayıcın değerini düşürür.
latch.countDown();
await metodu
Sayacın 0 olmasını bekler. Timeout ile kullanılabilirTimeoutException fırlatabilir.
long timeout = ...; TimeUnit unit = ...;
if (!latch.await(timeout, unit))
{
  throw new TimeoutException();
}
...
Timeout olmadan da kullanılabilir.
latch.await(); 
ReentrantLock
ReentrantLock Sınıfı yazısına taşıdım

Hiç yorum yok:

Yorum Gönder