Java-da BlockingQueue interfeysi


Bloklama Sırası Java Çox oxluBaxılıb 114

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.

Java-da BlockingQueue interfeysi

BlockingQueue bir interface Java paralel proqramının bir hissəsi olan Java-da java.util.concurrent paket. Bu queue yerləşdirmə və silmə əməliyyatları zamanı ipliyi bloklayan tətbiqetmə. Bu o deməkdir ki, insert əməliyyatı zamanı növbə maksimum tutuma çatdıqda ipliyi bloklayır. Eynilə, silmə əməliyyatı zamanı növbə boş olduqda ipliyi bloklayır. BlockingQueue'da 2 mövzu var, burada 1 mövzu elementləri növbəyə əlavə edən bir istehsalçıdır, digər mövzu isə elementləri növbədən çıxaran istehlakçıdır.

BlockingQueue tətbiqləri

Aşağıdakı siniflər Java-da BlockingQueue interfeysini tətbiq edirlər:

  • ArrayBlockingQueue
  • Gecikmə növbəsi
  • LinkedBlockingQueue
  • PriorityBlockingQueue
  • Sinxron Sual

Bloklama Sırası növləri

Java-da BlockingQueue interfeysi iki növ ola bilər:

  • Sərhədsiz növbə: Bir Sınırsız Sıra, növbənin tutumu maksimum olacaq, yəni elementləri əlavə etdikdə növbənin ölçüsü genişlənir. Bu səbəbdən heç vaxt bloklanacağı bir şərt olmayacaqdır. Növbənin ölçüsü Integer.MAX_VALUE olacaq.
    BlockingQueue bq = new LinkedBlockingDeque();
  • Məhdud növbə: Sınırlı bir növbədə, tutum arqumentini konstruktora ötürərək növbənin ölçüsünü elan edə bilərik. Bu vəziyyətdə növbənin tutumuna qərar veririk.
    BlockingQueue bq = new LinkedBlockingDeque(int capacity);

BlockingQueue işlənməsi

Java BlockingQueue interfeysi həmişə istehsalçının növbəyə elementlər əlavə etməsini və istehlakçı ipinin elementləri növbədən götürməsini təmin etdiyi istehsalçı və istehlakçı yivinə malikdir. Növbənin element əlavə etmək qabiliyyəti olmadığı zaman istehsalçı sapı bloklayır və bu səbəbdən istehlakçı ipi elementləri götürənə qədər gözləyir. Eynilə, istehlakçı iplik növbədən çıxmaq üçün daha çox element olmadığı zaman bloklayır və istehsalçı ipi bir element əlavə edənə qədər gözləyir.

Java-da BlockingQueue interfeysi

Java BlockingQueue metodları

Aşağıda Java BlockingQueue interfeysinin metodları verilmişdir.

metodikatəsvir
boolean əlavə (Tamsayı e)Sıra bir element əlavə edir
boolean tərkibində (Object o) varSırada göstərilən element varsa, doğru qaytarır
int drainTo (Koleksiyon c)Bütün elementləri növbədən çıxarır və göstərilən kolleksiyaya aparır. Aktarılan elementlərin sayını qaytarır
int drainTo (Collection c, int maxElements)Maksimum element sayını növbədən çıxarır və göstərilən kolleksiyaya əlavə edir
boolean təklif (Tam e)Göstərilən elementi daxil edir
boolean təklif (Tamsayı e, uzun fasilə, TimeUnit vaxt birliyi)Yer olmadığı təqdirdə göstərilən vaxtı gözlədikdən sonra göstərilən elementi növbəyə əlavə edir
Tamsayı anket (uzun fasilə, TimeUnit vaxt birliyi)Müəyyən vaxtı gözlədikdən sonra elementin başını götürür və çıxarır
boş yerə qoyun (Tamsayı e)Göstərilən elementi növbəyə əlavə edir
int qalanCapacity ()Növbəni bloklamadan qəbul edə biləcəyi element sayını qaytarır
boolean sil (Object e)Göstərilən elementi növbədən çıxarır
Tamsayı götür ()Növbənin başını götürür və götürür

Java BlockingQueue Nümunəsi

Bu, bir mövzu növbəyə elementlər əlavə edərkən digər mövzu növbədən elementləri çıxardığı bir Java BlockingQueue interfeysinin tipik bir nümunəsidir. Hər birindən sonra bir yuxu vaxtı daxil edirik put() üsul, növbəti elementi qoymadan əvvəl ipin bloklaşması üçün kifayət qədər növbə tutumu olsun. İstifadə take() metod, baş elementini növbədən çıxarıb ala bilərik.

import java.util.concurrent.*;

public class BlockingQueueDemo {

  public static void main(String[] args) {
    BlockingQueue<Integer> bq = new ArrayBlockingQueue<Integer>(10);
    insertElements add = new insertElements(bq);
    removeElements remove = new removeElements(bq);
    
    new Thread(add).start();
    new Thread(remove).start();

  }

}

class insertElements implements Runnable {
  
  protected BlockingQueue bq = null;
  
  insertElements(BlockingQueue bq) {
    this.bq = bq;
  }

  public void run() {
    try {
      bq.put(10);
      Thread.sleep(1000);
      bq.put(20);
      Thread.sleep(1000);
      bq.put(30);
    }
    catch(InterruptedException e){
      e.printStackTrace();
    }
  }
  
}

class removeElements implements Runnable {
  
  protected BlockingQueue bq = null;
  
  removeElements(BlockingQueue bq) {
    this.bq = bq;
  }
  
  public void run() {
    try {
      System.out.println(bq.take());
      System.out.println(bq.take());
      System.out.println(bq.take());
    }
    catch(InterruptedException e) {
      e.printStackTrace();
    }
  }
}
10
20
30

Misal: Elementləri daxil edin

Aşağıda, istifadə edərək növbəyə elementlərin daxil edilməsinə bir nümunədir add(), offer()put() Java BlockingQueue interfeysi metodu. Tutaq ki, bloklama növbəsinin tutumu 5 idi və sonra zəng edirik offer() üsul, növbəni element əlavə etmək üçün bir tutum olmayana qədər ipliyi bloklayır.

import java.util.concurrent.*;

public class BlockingQueueEx {

  public static void main(String[] args) {
    BlockingQueue<String> bq = new ArrayBlockingQueue<String>(10);
    
    bq.add("Java");
    bq.add("C");
    bq.add("C++");
    bq.add("Pyhton");
    bq.add("Perl");
    
    System.out.println("Elements in the blockingqueue: " + bq);

    bq.offer("Ruby");
    bq.put("VBScript");
    System.out.println("Elements in the blockingqueue: " + bq);

  }

}
Elements in the blockingqueue: [Java, C, C++, Pyhton, Perl]
Elements in the blockingqueue: [Java, C, C++, Python, Perl, Ruby, VBScript]

Misal: Elementləri silin

Aşağıdakı elementlərdən istifadə edərək növbədən elementlərin silinməsinə bir nümunədir remove(), take()poll() Java BlockingQueue interfeysində mövcud olan metod.

import java.util.concurrent.*;

public class BlockingQueueEx {

  public static void main(String[] args) throws InterruptedException {
    BlockingQueue<String> bq = new ArrayBlockingQueue<String>(5);
    
    bq.add("Java");
    bq.add("C");
    bq.add("C++");
    bq.add("Python");
    bq.add("Perl");
    
    System.out.println("Elements in the blockingqueue: " + bq);
    
    bq.remove("C++");
    bq.take();
    
    bq.offer("Ruby");
    bq.put("VBScript");
    System.out.println("Elements in the blockingqueue: " + bq);
    
    bq.poll(2, TimeUnit.SECONDS);
    System.out.println("Elements in the blockingqueue: " + bq);

  }

}
Elements in the blockingqueue: [Java, C, C++, Python, Perl]
Elements in the blockingqueue: [C, Python, Perl, Ruby, VBScript]
Elements in the blockingqueue: [Python, Perl, Ruby, VBScript]

Nümunə: Giriş elementləri

Bu nümunə baş elementini kimi növbədən almaq üçün müxtəlif üsulları göstərir element()peek() Java BlockingQueue interfeysinin bir hissəsidir. Bu üsullar yalnız elementi alır və növbədən çıxarmır. Da istifadə edərək növbədə bir elementin olub olmadığını yoxlaya bilərik contains() metodu.

import java.util.concurrent.*;

public class BlockingQueueEx {

  public static void main(String[] args) throws InterruptedException {
    BlockingQueue<String> bq = new ArrayBlockingQueue<String>(5);
    
    bq.add("Java");
    bq.add("C");
    bq.add("C++");
    bq.add("Python");
    bq.add("Perl");
    
    System.out.println("Elements in the blockingqueue: " + bq);
    
    bq.remove("C++");
    bq.take();
    System.out.println("Elements in the queue afer remove operation: " + bq);
    System.out.println("Head element: " + bq.peek());
    
    bq.offer("Ruby");
    bq.put("VBScript");
    System.out.println("Elements in the blockingqueue: " + bq);
    
    bq.poll(2, TimeUnit.SECONDS);
    System.out.println("Elements in the blockingqueue: " + bq);
    
    System.out.println("Head element: " + bq.element());
    
    System.out.println(bq.contains("Ruby"));
    

  }

}
Elements in the blockingqueue: [Java, C, C++, Python, Perl]
Elements in the queue afer remove operation: [C, Python, Perl]
Head element: C
Elements in the blockingqueue: [C, Python, Perl, Ruby, VBScript]
Elements in the blockingqueue: [Python, Perl, Ruby, VBScript]
Head element: Python
true

Misal: BlockingQueue-da elementlərin təkrarlanması

Elementlərini istifadə edərək təkrarlaya bilərik iterator() Java BlockingQueue interfeysində mövcud olan metod. İt istifadə edərək iteratordakı hər bir elementə daxil olur next() metod. İstifadə edərək növbə ölçüsünü əldə edə bilərik size() metodu istifadə edərək elementləri əlavə etdikdən sonra mövcud tutumu əldə edin remainingCapacity() metodu.

import java.util.Iterator;
import java.util.concurrent.*;

public class BlockingQueueEx {

  public static void main(String[] args) throws InterruptedException {
    BlockingQueue<String> bq = new ArrayBlockingQueue<String>(5);
    
    bq.add("Java");
    bq.add("C");
    bq.add("C++");
    bq.add("Python");
    bq.add("Perl");
    
    System.out.println("Size of the queue: " + bq.size());
    
    Iterator<String> it = bq.iterator();
    while(it.hasNext())
      System.out.println(it.next());
    System.out.println("Remaining capacity: " + bq.remainingCapacity());

  }

}
Size of the queue: 5
Java
C
C++
Python
Perl
Remaining capacity: 0

arayış

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