Packagethreadtest;Importjava.util.LinkedList;ImportJava.util.concurrent.TimeUnit;ImportJava.util.concurrent.atomic.AtomicInteger; Public classQueueTest01 {Privatelinkedlist<object> list =NewLinkedlist<object>(); PrivateAtomicinteger count =NewAtomicinteger (0); Private Final intMinSize = 0; Private Final intmaxSize; PublicQUEUETEST01 (intmaxsize) { This. maxSize =maxsize; } Private FinalObject lock =NewObject (); Public voidput (Object obj) {synchronized(lock) { while( This. maxSize = =Count.get ()) { Try{lock.wait (); } Catch(interruptedexception e) {//TODO auto-generated Catch blockE.printstacktrace (); }} list.add (obj); Count.incrementandget (); System.out.println ("The newly added element is:" +obj); Lock.notify (); } } Publicobject Take () {object obj=NULL; synchronized(lock) { while( This. minSize = =Count.get ()) { Try{lock.wait (); } Catch(interruptedexception e) {//TODO auto-generated Catch blockE.printstacktrace (); }} obj=List.removefirst (); Count.decrementandget (); Lock.notify (); } returnobj; } Public Static voidMain (string[] args) {FinalQueueTest01 myqueue =NewQUEUETEST01 (5); Myqueue.put (A); Myqueue.put ("B"); Myqueue.put (C); Myqueue.put ("D"); Myqueue.put (E); System.out.println ("The current length of the column:" +myQueue.list.size ()); Thread T1=NewThread (NewRunnable () {@Override Public voidrun () {Myqueue.put ("F"); Myqueue.put ("G"); } }, "T1"); T1.start (); Thread T2=NewThread (NewRunnable () {@Override Public voidrun () {Object O1=Myqueue.take (); System.out.println ("The removed element is:" +O1); Object O2=Myqueue.take (); System.out.println ("The removed element is:" +O2); } }, "T2"); Try{TimeUnit.SECONDS.sleep (2); } Catch(interruptedexception e) {//TODO auto-generated Catch blockE.printstacktrace (); } t2.start (); }}
The way to learn multithreading-learning wait and notify