This is a common mode for Java Development. It allows the program to call each other between producers and consumers during design.
Three objects need to be created in the mode: producer consumer warehouse
Producer: Put the products produced into the total warehouse
Consumer: extracts products from the warehouse for consumption.
Warehouse: A synchronization method is used to lock and synchronize the warehouse. Only one object can be operated on at a time.
The class diagram is as follows:
Repository code: queue-based implementation
Package consumer; </P> <p> Import Java. util. concurrent. arrayblockingqueue; </P> <p> Import Org. slf4j. logger; <br/> Import Org. slf4j. loggerfactory; </P> <p> public class serveralarmqueue {<br/> Private Static int max_size = 1000; <br/> Private Static logger = loggerfactory. getlogger (serveralarmqueue. class); <br/> Private Static arrayblockingqueue <Object> alramqueue = NULL; <br/> Public serveralarmqueue (INT capacity) {<br/> super (); <br/> max_size = capacity; <br/> alramqueue = new arrayblockingqueue <Object> (capacity); <br/>}</P> <p> Public serveralarmqueue () {<br/> super (); <br/> alramqueue = new arrayblockingqueue <Object> (max_size ); <br/>}</P> <p>/** <br/> * Get an object from the end of the queue <br/> * @ return <br /> */<br/> Public synchronized object consume () {<br/> Object object = NULL; <br/> while (getqueuesize () = 0) {<br/> try {<br/> wait (); <br/> logger. debug ("the queue is empty, consumption wait... "); <br/>} catch (interruptedexception e) {<br/> E. printstacktrace (); <br/>}< br/> Object = alramqueue. poll (); <br/> system. out. println (thread. currentthread (). getname () + "consumption product:" + object. tostring (); <br/> This. policyall (); <br/> return object; <br/>}</P> <p>/** <br/> * Insert an object to another object <br/> * @ Param object <br/> * @ return <br/> */<br/> Public synchronized Boolean produce (Object object) {<br/> Boolean flag = false; <br/> while (getqueuesize () = max_size) {<br/> try {<br/> wait (); <br/> logger. debug ("the queue is full, production Waits .... "); <br/>} catch (interruptedexception e) {<br/> E. printstacktrace (); <br/>}< br/> flag = alramqueue. offer (object); <br/> system. out. println (thread. currentthread (). getname () + "produce product:" + object. tostring (); <br/> This. policyall (); <br/> return flag; <br/>}</P> <p> Public int getqueuesize () {<br/> return alramqueue. size (); <br/>}</P> <p> Public void clear () {<br/> alramqueue. clear (); <br/>}</P> <p >}< br/>
Consumer:
Package consumer; </P> <p> public class Consumer implements runnable {<br/> private serveralarmqueue = NULL; <br/> private Boolean isstart = true; </P> <p> public consumer (serveralarmqueue) {<br/> super (); <br/> This. serveralarmqueue = serveralarmqueue; <br/>}</P> <p> @ override <br/> Public void run () {<br/> while (isstart) {<br/> getproducts (); <br/> try {</P> <p> // wait for 30 ms <br/> thread. sleep (30); <br/>}catch (exception e) {<br/> E. printstacktrace (); <br/>}</P> <p> private void getproducts () {<br/> Object OBJ = serveralarmqueue. consume (); <br/> system. out. println (OBJ); <br/>}</P> <p> Public void stop () {<br/> isstart = false; <br/>}< br/>
Producer:
Package COM. consume; </P> <p> public class producer implements runnable {<br/> private serveralarmqueue = NULL; </P> <p> Public producer (serveralarmqueue) {<br/> super (); <br/> This. serveralarmqueue = serveralarmqueue; <br/>}</P> <p> @ override <br/> Public void run () {<br/> char C; </P> <p> for (INT I = 0; I <200; I ++) {</P> <p> // generate random uppercase letters <br/> C = (char) (math. random () * 26 + 'A'); <br/> produce (C ); </P> <p> try {</P> <p> // wait for 30 milliseconds <br/> thread. sleep (30); <br/>}catch (exception e) {<br/> E. printstacktrace (); <br/>}</P> <p> private void produce (Object OBJ) {<br/> serveralarmqueue. produce (OBJ); <br/>}< br/>
Test code
Package COM. consume; </P> <p> public class threadmain {</P> <p> Public static void main (string [] ARGs) {<br/> // 1. prepare the stack data structure <br/> serveralarmqueue stack = new serveralarmqueue (); </P> <p> // 2. prepare the producer thread <br/> producer producer1 = new producer (stack); <br/> thread T1 = new thread (producer1 ); <br/> t1.setname ("producer 1"); </P> <p> producer producer2 = new producer (stack ); <br/> thread t2 = new thread (producer2); <br/> t2.setname ("producer 2"); </P> <p> // 3. prepare the consumer thread <br/> consumer consumer1 = new consumer (stack); <br/> thread T3 = new thread (consumer1 ); <br/> t3.setname ("Consumer 1"); </P> <p> consumer consumer2 = new consumer (stack ); <br/> thread t4 = new thread (consumer2); <br/> t4.setname ("Consumer 2"); </P> <p> t3.start (); <br/> t4.start (); </P> <p> t1.start (); <br/> t2.start (); <br/>}< br/>