Semafor

Semaforlar genellikle dosya sistemiyle çalışırken iş parçacığı sayısını sınırlamak gerektiğinde kullanılır. Bir dosyaya veya başka bir paylaşılan kaynağa erişim, bir sayaç aracılığıyla denetlenir. Değeri sıfırdan büyükse erişime izin verilir, ancak aynı zamanda sayaç azalır.

Sayacın sıfıra döndüğü anda, mevcut iş parçacığı, kaynak başka bir iş parçacığı tarafından serbest bırakılana kadar bloke edilir. İzin parametresi sayısı, yapıcı aracılığıyla ayarlanmalıdır.

Bilgisayarınızın veya dizüstü bilgisayarınızın gücüne bağlı olarak bu parametreyi ayrı ayrı seçmeniz gerekir.

public class Main {

   public static void main(String[] args) {
       Semaphore sem = new Semaphore(1);
       CommonResource res = new CommonResource();
       new Thread(new MyThread(res, sem, "MyThread_1")).start();
       new Thread(new MyThread(res, sem, "MyThread_2")).start();
       new Thread(new MyThread(res, sem, "MyThread_3")).start();
   }
}

class CommonResource {
   int value = 0;
}

class MyThread implements Runnable {
   CommonResource commonResource;
   Semaphore semaphore;
   String name;
   MyThread(CommonResource commonResource, Semaphore sem, String name) {
       this.commonResource = commonResource;
       this.semaphore = sem;
       this.name = name;
   }

   public void run() {

       try {
           System.out.println(name + "waiting permission");
           semaphore.acquire();
           commonResource.value = 1;
           for (int i = 1; i < 7; i++) {
               System.out.println(this.name + ": " + commonResource.value);
               commonResource.value++;
               Thread.sleep(150);
           }
       } catch (InterruptedException e) {
           System.out.println(e.getMessage() + " " + name);
           Thread.currentThread().interrupt();
       }
       System.out.println(name + "releases permission");
       semaphore.release();
   }
}

CountDownLatch ve diğerleri

CountDownLatch - Birden çok iş parçacığının, diğer iş parçacıklarında gerçekleştirilen belirli sayıda işlem tamamlanana kadar beklemesine izin verir. Bir uygulamanın yüklenmesi buna bir örnektir: siz kullanım koşullarını kabul edene kadar, yeni bir programın kurulacağı klasörü seçene kadar, vb. başlamaz. Bunun için özel bir countDown() yöntemi vardır- bu yöntem geri sayım sayacını bir azaltır.

Sayı sıfıra iner inmez, wait içindeki tüm bekleyen thread'ler çalışmalarına devam edecek ve sonraki tüm wait çağrıları beklemeden geçecektir. Geri sayım sayacı tek seferlik bir sayaçtır ve sıfırlanamaz.

CyclicBarrier - belirli sayıda iş parçacığını bir noktada senkronize etmek için kullanılır. Engele, N iş parçacığı wait(...) yöntemini çağırıp bloke ettiğinde ulaşılır. Bundan sonra sayaç orijinal değerine sıfırlanır ve bekleyen iplikler serbest bırakılır. Ek olarak, gerekirse, iş parçacıklarının engellemesini kaldırmadan ve sayacı sıfırlamadan önce özel kod çalıştırmak mümkündür. Bunu yapmak için, Runnable arabiriminin uygulanmasına sahip bir nesne.

Exchanger<V> Exchanger sınıfı , iş parçacıkları arasında veri alışverişi için tasarlanmıştır. Yazılır ve iş parçacıklarının değiş tokuş etmesi gereken veri türünü yazar.

Veriler, bu sınıfın tek exchange() yöntemi kullanılarak değiştirilir :

V exchange(V x) throws InterruptedException
V exchange(V x, long timeout, TimeUnit unit) throws InterruptedException, TimeoutException

x parametresi, değiştirilecek veri arabelleğini temsil eder. Yöntemin ikinci biçimi ayrıca timeout parametresini , timeout'u ve timeout parametresi için kullanılacak zaman birimi türü olan unit'i tanımlar .

Phaser sınıfı, genel bir eylemin yürütülmesinde tek bir aşamayı veya aşamayı temsil eden dizileri senkronize etmenize izin verir. Phaser, belirli bir aşama tamamlanana kadar bekleyen bir senkronizasyon nesnesi tanımlar. Phaser daha sonra bir sonraki aşamaya veya aşamaya geçer ve tekrar tamamlanmasını bekler.

Phaser sınıfıyla çalışırken , önce nesnesini oluşturmak yaygındır. Ardından, tüm katılımcıları kaydetmemiz gerekiyor. Her katılımcıya kaydolmak için register () yöntemi çağrılır veya gerekli sayıda katılımcıyı Phaser yapıcısına ileterek bu yöntem olmadan da yapabilirsiniz .

Daha sonra her katılımcı, aşamayı oluşturan belirli bir dizi eylemi gerçekleştirir. Ve Phaser eşleyici , tüm katılımcılar aşamanın yürütülmesini tamamlayana kadar bekler. Eşzamanlayıcıya fazın sona erdiğini bildirmek için, katılımcı abuse () veya abuseAndAwaitAdvance() yöntemini çağırmalıdır . Eşleyici daha sonra bir sonraki aşamaya geçer.