Java-da CyclicBarrier


Cyclic Barrier Java Çox oxluBaxılıb 94

Sistem dizaynı ilə bağlı müsahibə sualları o qədər açıq ola bilər ki, düzgün hazırlaşmağı bilmək çox çətindir. İndi satın aldıqdan sonra Amazon, Microsoft və Adobe-nin dizayn dövrlərini sındıra bilirəm Bu kitabı. Gündəlik bir yenidən nəzərdən keçirin dizayn sualı və söz verirəm ki, dizayn dövrünü sındıra bilərsiniz.

Bu təlimat, nümunə ilə yanaşı paralel bir köməkçi proqram olan Java-da CyclicBarrier'i anlamağınıza kömək edəcəkdir.

Java CyclicBarrier

CyclicBarrier, bir hissəsi olan bir sinxronizasiya texnikasıdır java.util.concurrent paketi və Java5 mövcuddur. CyclicBarrier hamını gözləyir mövzuları icrasını bir nöqtəyə çatmadan tamamlamaq. Bu nöqtə, bütün iplərin buraya çatmadan icra olunmasını təmin edən maneədir. Başqa sözlə, hər bir mövzu bir alt vəzifə yerinə yetirə bilər və nəhayət ana ipin bütün bu tapşırıqların nəticəsini birləşdirməsini təmin edir. Mövzular icrasını tamamladıqdan sonra, zəng edərək bir-birlərini gözləyirlər await() metodu.

Bir CyclicBarrier iş

Konstruktordakı mövzu sayını göstərərək bir CyclicBarrier yarada bilərik. Bu, maneəni gözləmək üçün neçə mövzuya ehtiyac olduğunu göstərir. Hər bir mövzu await() icrası tamamlandıqdan sonra metod.

CyclicBarrier cb = new CyclicBarrier(int thread_count);

Mövzu sayımı ilə birlikdə bəzi hərəkətlər göstərərək bir CyclicBarrier yaratmaq da mümkündür. Bu hərəkət, bütün iplərin bariyerə çatdıqdan sonra yerinə yetirdiyi vəzifəni ifadə edir.

CyclicBarrier cb = new CyclicBarrier(thread_count, action);

Java Nümunəsində CyclicBarrierPin

Java CyclicBarrier metodları

Aşağıda Java-da CyclicBarrier sinifində mövcud olan metodlar verilmişdir.

Üsultəsvir
int gözləyirəm ()Bütün iplər bariyerə çatana qədər gözləyin
int gözləyir (giriş vaxtı, TimeUnit vahidi)Bütün iplər bariyerə çatana qədər və ya müəyyən bir müddət keçənə qədər gözləyin
int getNumberWaiting ()Baryerdə gözləyən iplik sayını qaytarır
int getParties ()Bu baryerə çatmaq üçün tələb olunan tərəflərin sayını qaytarır
boolean isBroken ()Baryerin pozulmuş vəziyyətdə olduğu gerçək qayıdır
etibarsız sıfırlama ()Maneəni ilkin vəziyyətə qaytarır

CyclicBarrier Nümunəsi

Aşağıda CyclicBarrier-in işləmə və istifadəsini və onun metodlarını göstərmək üçün bir nümunə var. Bu nümunəni ətraflı başa düşək.

Müvafiq olaraq String dəyişəninin dəyərlərini başlatan 2 alt mövzu "Thread1" və "Thread2" var. 3 əsas sayı olan CyclicBarrier yaratdığımız əsas ana mövzu “MainThread” də var.

Əvvəlcə, getParties() maneə gözləyən 3 iplik olduğundan metod 3 qaytarır. String dəyişəninin başlanğıc dəyərləri sıfırdır, çünki uşaq mövzuları icra edilməyib. Biz çağırırıq zaman start() uşaq iplərindəki metod, uyğun olanı həyata keçirir run() metodlar. Thread2 icrası zamanı getNumberWaiting() icra gözləyən daha çox mövzu olmadığından metod 0 qaytarır.

import java.util.concurrent.*;

public class MainThread implements Runnable {

  public static CyclicBarrier cb = new CyclicBarrier(3);
  
  public static void main(String[] args) {
    MainThread mt = new MainThread();
    Thread t = new Thread(mt);
    t.start();
  }

  @Override
  public void run() {
    System.out.println("Number of parties at the barrier: " + cb.getParties());
    System.out.println("Values of String: " + Thread1.value + " " + Thread2.text);
    
    Thread1 th1 = new Thread1();
    Thread2 th2 = new Thread2();
    
    Thread t1 = new Thread(th1);
    Thread t2 = new Thread(th2);
    
    t1.start();
    t2.start();
    
    try {
      MainThread.cb.await();
    } catch (InterruptedException | BrokenBarrierException e) {
      e.printStackTrace();
    }
    
    System.out.println("Values of String: " + Thread1.value + " " + Thread2.text);
    cb.reset();
    System.out.println("CyclicBarrier reset operation");
    
  }

}

class Thread1 implements Runnable {

  public static String value;
  @Override
  public void run() {
    value = "Thread 1";
    try {
      MainThread.cb.await();
    } catch (InterruptedException e) {
      e.printStackTrace();
    } catch (BrokenBarrierException e) {
      e.printStackTrace();
    }
    
  }
  
}

class Thread2 implements Runnable {

  public static String text;
  @Override
  public void run() {
    System.out.println("Barrier broken: " + MainThread.cb.isBroken());
    text = "Thread 2";
    try {
      MainThread.cb.await(1000, TimeUnit.MILLISECONDS);
      System.out.println("Number of waiting threads: " + MainThread.cb.getNumberWaiting());
    } catch (InterruptedException e) {
      e.printStackTrace();
    } catch (BrokenBarrierException e) {
      e.printStackTrace();
    } catch (TimeoutException e) {
      e.printStackTrace();
    }
    
  }
  
}
Number of parties at the barrier: 3
Values of String: null null
Barrier broken: false
Values of String: Thread 1 Thread 2
CyclicBarrier reset operation
Number of waiting threads: 0

CyclicBarrier və CountDownLatch arasındakı fərq

Cyclic BarrierCountdownLatch
CyclicBarrier-i bütün iplər baryeri buraxdıqdan sonra dəfələrlə istifadə edə bilərik.CountDownLatch-i say 0-a çatana qədər yalnız bir dəfə istifadə edə bilərik
Bir-birinin maneə nöqtəsinə çatmasını gözləyən bir sinxronizasiya texnikasıdırBütün mövzuların icrası başa çatana qədər gözləyən bir sinxronizasiya texnikasıdır
Mövzu sayını qoruyurTapşırıq sayını saxlayır
Gözləyərkən 1 mövzu kəsilirsə, digər gözləmə mövzuları BrokenBarrierException atacaqYalnız cari mövzu InterruptException atacaq və digər mövzuları təsir etmir.

arayış

Crack Sistemi Dizayn Müsahibələri
Translate »
1