Halimbawa ng SynchronousQueue sa Java - paglutas ng problemang Producer Consumer
Ang SynchronousQueue ay isang espesyal na uri ng BlockingQueue kung saan ang bawat insert na operasyon ay dapat maghintay para sa isang kaukulang utos ng pag-alis sa isa pang thread, at vice versa. Kapag tinawag mo ang put() na pamamaraan sa isang SynchronousQueue, haharang ito hanggang sa kunin ng isa pang thread ang elementong iyon mula dito. Alinsunod dito, kung ang isa pang thread ay sumusubok na mag-alis ng isang elemento mula dito, at ang elemento ay wala doon, pagkatapos ay ang thread na iyon ay humaharang hanggang sa ilagay ng kabilang thread ang elemento sa pila. Maaari mong isipin ang SynchronousQueue bilang isang atleta ( thread ) na tumatakbo gamit ang Olympic torch, tumatakbo siya gamit ang torch (ang bagay na ipinapasa) at ipinapasa ito sa isa pang atleta na naghihintay sa kabilang panig. Kung bibigyan mo ng pansin ang pangalan, mauunawaan mo na ang SynchronousQueue ay pinangalanan para sa isang dahilan, naglilipat ito ng data nang sabay-sabay sa isa pang thread ; naghihintay ito para sa isang tao na kunin ang data sa halip na ilagay lamang ito at lumabas (isang asynchronous na operasyon). Kung pamilyar ka sa CSP at Ada, alam mo na ang mga naka-synchronize na pila ay katulad ng pagpupulong ng mga thread. Ang mga ito ay angkop para sa mga control transfer construct kung saan ang isang bagay na tumatakbo sa isang thread ay dapat mag-synchronize sa isang bagay sa isa pang thread upang maipasa ang ilang impormasyon, kaganapan, o gawain dito. Sa mga nakaraang multi-threaded programming tutorial, natutunan namin kung paano lutasin ang problema ng producer-consumer gamit ang wait and notify at BlockingQueue na mga paraan . Ngayon ay matututunan natin kung paano ilapat ang pattern ng producer-consumer gamit ang SynchronousQueue. Sinusuportahan din ng klase na ito ang patas na pag-uugali para sa pag-order ng mga paghihintay ng mga thread ng producer at consumer. Bilang default, ang pag-order na ito ay hindi ginagarantiyahan. Gayunpaman, ang mga queue na ginawa gamit ang mga patas na property ay ginagarantiyahan ang access para sa mga thread sa isang FIFO (Firs In First Out) queue.Producer/Consumer gamit ang SynchronousQueue sa Java.

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).
Ano ang kailangan mong tandaan tungkol sa SynchronousQueue sa Java.
Narito ang ilang mahahalagang katangian ng espesyal na uri ng pagharang na pila sa Java. Ito ay lubhang kapaki-pakinabang upang ipasa ang data mula sa isang thread patungo sa isa pa sa isang naka-synchronize na paraan. Ang pila na ito ay walang kapasidad at na-block hanggang sa isa pang thread ay palayain ito.
- Bina-block ang SynchronousQueue, at hanggang sa ang isang thread ay handa nang kumuha ng data, susubukan ng isa pang maglagay ng data.
- Walang volume ang SynchronousQueue. Ibig sabihin, hindi ito naglalaman ng data.
- Ginagamit ang SynchronousQueue upang magpatupad ng diskarte sa pag-forward queuing, kung saan ipinapasa ng isang thread ang kontrol sa naghihintay na thread, o gagawa ng bago kung pinapayagan, kung hindi, hindi ililipat ang kontrol.
- Hindi pinapayagan ng queue na ito ang null data. Ang isang pagtatangka upang magdagdag ng isang null elemento ay magtapon ng isang NullPointerException .
- Kung gumagamit ka ng iba pang mga pamamaraan mula sa Collection (tulad ng mga naglalaman), kumikilos ang SynchronousQueue na parang walang laman na koleksyon.
- Hindi mo magagamit ang paraan ng pagsilip ng SynchronousQueue dahil umiiral lang ang elemento kapag sinubukan mong alisin ito; Gayundin, hindi ka makakapagpasok ng mga elemento (gamit ang anumang paraan) hanggang sa subukan ng isa pang thread na alisin ito.
- Hindi mo magagamit ang iterator para sa SynchronousQueue dahil... wala itong elemento.
- Maaaring gawin ang SynchronousQueue gamit ang mga patas na panuntunan, kung saan ang access sa mga thread ay ginagarantiyahan sa FIFO order.
GO TO FULL VERSION