JavaRush /Java Blog /Random-ID /Contoh SynchronousQueue di Java - memecahkan masalah Prod...
profeg
Level 18

Contoh SynchronousQueue di Java - memecahkan masalah Produser Konsumen

Dipublikasikan di grup Random-ID
Contoh SynchronousQueue di Java - memecahkan masalah Produser Konsumen
SynchronousQueue adalah tipe khusus BlockingQueue di mana setiap operasi penyisipan harus menunggu perintah penghapusan yang sesuai di thread lain, dan sebaliknya. Saat Anda memanggil metode put() pada SynchronousQueue, metode tersebut akan memblokir hingga thread lain mengambil elemen tersebut darinya. Oleh karena itu, jika thread lain mencoba menghapus elemen darinya, dan elemen tersebut tidak ada, maka thread tersebut akan diblokir hingga thread lain memasukkan elemen tersebut ke dalam antrian. Anda dapat membayangkan SynchronousQueue sebagai seorang atlet ( thread ) berlari dengan obor Olimpiade, dia berlari dengan obor (benda yang diteruskan) dan meneruskannya ke atlet lain yang menunggu di sisi lain. Jika Anda memperhatikan namanya, Anda akan memahami bahwa SynchronousQueue dinamai demikian karena suatu alasan; ia mentransfer data secara sinkron ke thread lain ; ia menunggu seseorang untuk mengambil data alih-alih hanya memasukkannya dan keluar (operasi asinkron). Jika Anda familiar dengan CSP dan Ada, maka Anda pasti tahu bahwa antrian tersinkronisasi mirip dengan pertemuan thread. Mereka sangat cocok untuk konstruksi transfer kontrol di mana objek yang berjalan di satu thread harus melakukan sinkronisasi dengan objek di thread lain untuk meneruskan beberapa informasi, peristiwa, atau tugas ke objek tersebut. Pada tutorial pemrograman multi-thread sebelumnya, kita telah mempelajari cara menyelesaikan masalah produsen-konsumen menggunakan metode wait and notify dan BlockingQueue . Sekarang kita akan mempelajari cara menerapkan pola produsen-konsumen menggunakan SynchronousQueue. Kelas ini juga mendukung perilaku adil dalam memesan menunggu benang produsen dan konsumen. Secara default, pemesanan ini tidak dijamin. Namun, antrean yang dibuat dengan properti adil menjamin akses untuk thread dalam antrean FIFO (Firs In First Out).
Produser/Konsumen menggunakan SynchronousQueue di Java.
Contoh SynchronousQueue di Java - menyelesaikan masalah Produser Konsumen - 1 Seperti yang saya katakan di atas, tidak ada yang lebih baik daripada masalah produsen-konsumen untuk memahami komunikasi antar-thread dalam bahasa pemrograman apa pun. Dalam masalah ini, satu thread bertindak sebagai produsen yang menghasilkan peristiwa dan tugas, dan thread lainnya bertindak sebagai konsumennya. Buffer bersama digunakan untuk mentransfer data dari produsen ke konsumen. Kesulitan dalam memecahkan masalah ini muncul dalam kasus-kasus ekstrim, misalnya ketika pabrikan terpaksa menunggu karena... buffernya penuh atau konsumen terpaksa menunggu karena buffernya kosong. Ini mudah diselesaikan, karena... Antrian pemblokiran tidak hanya menyediakan buffer untuk menyimpan data, tetapi juga kontrol aliran, memblokir thread yang memanggil metode put() (Produser) jika buffer penuh, dan memblokir thread yang memanggil metode take() (Konsumen) jika buffernya kosong. Sekarang kita akan menyelesaikan masalah yang sama menggunakan SynchronousQueue, sejenis koleksi paralel khusus dengan kapasitas nol. Dalam contoh berikut, kita mempunyai dua thread bernama PRODUCER dan CONSUMER (selalu beri nama pada thread, ini adalah gaya pemrograman multi-thread yang sangat bagus).Thread pertama memposting skor dalam permainan, dan thread kedua mengkonsumsinya. Skor dalam permainan tidak lebih dari sebuah objek bertipe String. Namun jika Anda menjalankan program dengan tipe yang berbeda, Anda tidak akan melihat perbedaan apa pun. Untuk memahami cara kerja SynchronousQueue, dan cara mengatasi masalah produsen-konsumen, Anda perlu: menjalankan program untuk debugging (debug) di lingkungan Eclipse , atau cukup memulai thread produsen dengan mengomentari konsumen.start(); jika thread konsumen tidak berjalan maka thread produsen akan diblokir di queue.put(event); jika berjalan, Anda tidak akan dapat melihat produser [PRODUCER] memublikasikan acara :FOUR. Hal ini terjadi karena perilaku spesifik SynchronousQueue, yang memastikan bahwa thread yang memposting data akan diblokir hingga thread lain mengambil data tersebut, dan sebaliknya. Anda dapat menguji sisa kode dengan mengomentari producer.start(); dan hanya memulai thread konsumen. Jika Anda mempelajari dengan cermat apa yang dihasilkan program, Anda akan melihat bahwa urutan keluarannya terbalik. Sepertinya thread [CONSUMER] mengambil data sebelum thread [PRODUCER] memproduksinya. Hal ini karena SynchronousQueue tidak menjamin antrian secara default. Namun ia memiliki aturan keadilan yang mengatur akses ke thread dalam urutan FIFO. Anda dapat mengaktifkan aturan ini dengan meneruskan true ke konstruktor SynchronousQueue yang kelebihan beban seperti ini: import java.util.concurrent.SynchronousQueue; /** * Java Program to solve Producer Consumer problem using SynchronousQueue. A * call to put() will block until there is a corresponding thread to take() that * element. * * @author Javin Paul */ public class SynchronousQueueDemo{ public static void main(String args[]) { final SynchronousQueue queue = new SynchronousQueue (); Thread producer = new Thread("PRODUCER") { public void run() { String event = "FOUR"; try { queue.put(event); // thread will block here System.out.printf("[%s] published event : %s %n", Thread .currentThread() .getName(), event); } catch (InterruptedException e) { e.printStackTrace(); } } }; producer.start(); // starting publisher thread Thread consumer = new Thread("CONSUMER") { public void run() { try { String event = queue.take(); // thread will block here System.out.printf("[%s] consumed event : %s %n", Thread .currentThread() .getName(), event); } catch (InterruptedException e) { e.printStackTrace(); } } }; consumer.start(); // starting consumer thread } } Output: [CONSUMER] consumed event : FOUR [PRODUCER] published event : FOUR new SynchronousQueue(boolean fair).
Yang perlu Anda ingat tentang SynchronousQueue di Java.

Berikut adalah beberapa properti penting dari jenis antrian pemblokiran khusus ini di Java. Sangat berguna untuk meneruskan data dari satu thread ke thread lainnya secara tersinkronisasi. Antrian ini tidak memiliki kapasitas dan diblokir hingga thread lain membebaskannya.

  1. SynchronousQueue memblokir, dan hingga satu thread siap mengambil data, thread lain akan mencoba memasukkan data.
  2. SynchronousQueue tidak memiliki cakupan. Artinya, tidak mengandung data.
  3. SynchronousQueue digunakan untuk menerapkan strategi antrian maju, di mana sebuah thread meneruskan kontrol ke thread yang menunggu, atau membuat thread baru jika diizinkan, jika tidak, kontrol tidak akan ditransfer.
  4. Antrian ini tidak mengizinkan data nol. Upaya untuk menambahkan elemen null akan memunculkan NullPointerException .
  5. Jika Anda menggunakan metode lain dari Koleksi (seperti berisi), SynchronousQueue berperilaku seperti koleksi kosong.
  6. Anda tidak dapat menggunakan metode mengintip SynchronousQueue karena elemen tersebut hanya ada saat Anda mencoba menghapusnya; Selain itu, Anda tidak akan dapat menyisipkan elemen (menggunakan metode apa pun) hingga thread lain mencoba menghapusnya.
  7. Anda tidak akan dapat menggunakan iterator untuk SynchronousQueue karena... tidak memiliki elemen.
  8. SynchronousQueue dapat dibuat dengan aturan yang adil di mana akses ke thread dijamin dalam urutan FIFO.
Mungkin ini semua tentang SynchronousQueue di Java. Kami melihat beberapa fitur khusus dari koleksi multi-utas ini, dan mempelajari cara memecahkan masalah klasik produsen-konsumen menggunakan SynchronousQueue di Java. Ngomong-ngomong, menyebutnya Antrian tidak sepenuhnya benar, karena... itu tidak mengandung unsur. Panggilan ke put() tidak akan selesai sampai thread lain memanggil take(). Lebih tepat jika menganggapnya sebagai tempat bertemunya benang-benang, tempat mereka berbagi suatu objek. Dengan kata lain, ini adalah utilitas untuk pengiriman objek yang disinkronkan di Java, mungkin merupakan alternatif yang lebih aman daripada metode tunggu dan beri tahu .
Komentar
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION