package Ġcom . example . concurrent . blocking queue . array blocking queue Ċ Ċ import Ġcom . example . util . Utility Ċ import Ġjava . util .* Ċ import Ġjava . util . concurrent . Array BlockingQueue Ċ import Ġjava . util . concurrent . BlockingQueue Ċ import Ġjava . util . concurrent . atomic . Atomic Integer Ċ Ċ /** Ċ Ġ* ĠBlock ing Queue å®ŀçİ° çĶŁäº§ èĢħ æ¶Īè´¹ èĢħ æ¨¡åŀĭ Ċ Ġ* Ċ Ġ* Ġ@ author ĠV ance King Ċ Ġ* Ġ@ since Ġ 2 0 1 7 / 4 / 1 6 . Ċ Ġ*/ Ċ @ Volatile Ċ private Ġvar Ġcheck : ĠBoolean Ġ= Ġtrue Ċ private Ġval Ġprinter : ĠPrinter Ġ= ĠPrinter () Ċ private Ġval Ġdead Number Ġ= Ġ 1 0 Ċ Ċ fun Ġmain () Ġ{ ĊĠĠĠ Ġtest 1 () Ċ } Ċ Ċ private Ġfun Ġtest 1 () Ġ{ ĊĠĠĠ Ġval Ġqueue Ġ= ĠArray BlockingQueue < Int >( 2 ) ĊĊĠĠĠ Ġval Ġproduce Task Ġ= ĠProducer ( queue ) ĊĠĠĠ ĠThread ( produce Task , Ġ" producer 1 "). start () ĊĠĠĠ ĠThread ( produce Task , Ġ" producer 2 "). start () ĊĠĠĠ ĠThread ( produce Task , Ġ" producer 3 "). start () ĊĊĠĠĠ Ġval Ġconsume Task Ġ= ĠConsumer ( queue ) ĊĠĠĠ ĠThread ( consume Task , Ġ" consumer 1 "). start () Ċ // ĠĠĠ ĠThread ( Consumer ( queue ), Ġ" consumer 2 "). start () Ċ } Ċ Ċ private Ġclass ĠProducer ( private Ġval Ġqueue : ĠBlock ing Queue < Int >) Ġ: ĠRunnable Ġ{ ĊĠĠĠ Ġprivate Ġval Ġnumber : ĠAtomicInteger Ġ= ĠAtomicInteger ( 1 ) ĊĠĠĠ Ġprivate Ġval Ġproducts : ĠMutable List < Int > Ġ= ĠCollections . synchronized List ( mutable ListOf ()) ĊĊĠĠĠ Ġoverride Ġfun Ġrun () Ġ{ ĊĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġwhile Ġ( check ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ/* if Ġ( queue . remaining Capacity () Ġ== Ġ 0 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġprinter . print ( Thread . currentThread (). name Ġ+ Ġ" éĺŁåĪĹ æ»¡ ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ}*/ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġproduce Ġ= Ġproduce () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(! check ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġprinter . print ( Thread . currentThread (). name Ġ+ Ġ" Ġcheck Ġ éĢĢåĩº ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbreak ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġqueue . put ( produce ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġprinter . print ( Thread . currentThread (). name Ġ+ Ġ" Ġproduce : Ġ" Ġ+ Ġproduce ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġproducts . add ( produce ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( produce Ġ== Ġdead Number ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcheck Ġ= Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġprinter . print (" åģľæŃ¢ ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġproducts . forEach Ġ{ Ġprinter . print ( it ) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbreak ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġprinter . print ( Thread . currentThread (). name Ġ+ Ġ" Ġwhile Ġ éĢĢåĩº ") ĊĊĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠInterruptedException ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġe . printStackTrace () ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġproduce (): ĠInt Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġan Int Ġ= Ġnumber . get And Increment () ĊĠĠĠĠĠĠĠ ĠUtility . sleep ( 1 0 0 0 ) ĊĠĠĠĠĠĠĠ Ġreturn Ġan Int ĊĠĠĠ Ġ} Ċ } Ċ Ċ private Ġclass ĠConsumer ( private Ġval Ġqueue : ĠBlock ing Queue < Int >) Ġ: ĠRunnable Ġ{ ĊĠĠĠ Ġoverride Ġfun Ġrun () Ġ{ ĊĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġwhile Ġ( true ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġconsume Ġ= Ġqueue . take () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġconsume ( consume ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġprinter . print ( Thread . currentThread (). name Ġ+ Ġ" Ġconsume : Ġ" Ġ+ Ġconsume ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( queue . isEmpty ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġprinter . print (" éĺŁåĪĹ ç©º ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbreak ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠInterruptedException ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġe . printStackTrace () ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġconsume ( x : ĠInt ) Ġ{ ĊĠĠĠĠĠĠĠ ĠUtility . sleep ( 2 0 0 0 ) ĊĠĠĠ Ġ} Ċ } Ċ Ċ private Ġclass ĠPrinter Ġ{ ĊĊĠĠĠ Ġ@ Synchron ized ĊĠĠĠ Ġfun Ġprint ( message : ĠAny ) Ġ{ ĊĠĠĠĠĠĠĠ Ġprintln ( message ) ĊĠĠĠ Ġ} Ċ } ĊĊ