Java Classic question-----producer Consumer
/*** Producer Consumer issues * Explanation: Wait Notify method * Difference between sleep and wait * line lock mechanism*/ Public classProducerconsumer { Public Static voidMain (string[] args) {syncstack ss=NewSyncstack (); Producer P=NewProducer (ss); Consumer C=NewConsumer (ss); NewThread (P). Start (); NewThread (c). Start (); }}classmt{intID; MT (intID) { This. ID =ID; } PublicString toString () {return"MT:" +ID; }}classSyncstack {intindex = 0 ; Mt[] MTS=NewMt[6]; Public synchronized voidpush (Mt MT) {if(Index = =mts.length) { Try { This. Wait (); }Catch(Interruptedexception ex) {ex.printstacktrace (); } } This. Notify (); Mts[index]=MT; Index++; } Public synchronizedMT Pop () {if(Index = = 0){ Try { This. Wait (); }Catch(Interruptedexception ex) {ex.printstacktrace (); } } This. Notify (); Index-- ; returnMts[index]; }}classProducerImplementsrunnable{Syncstack Stack=NULL; PublicProducer (Syncstack stack) { This. Stack =Stack; } Public voidrun () { for(inti = 0; I < 20; i + +) {MT Mt=NewMT (i); Stack.push (MT); System.out.println ("Produced:" +MT); Try{Thread.Sleep (int) (Math.random () *200)); }Catch(Interruptedexception ex) {ex.printstacktrace (); } } }}classConsumerImplementsrunnable{Syncstack Stack=NULL; PublicConsumer (Syncstack stack) { This. Stack =Stack; } Public voidrun () { for(inti = 0; I < 20; i + +) {MT Mt=Stack.pop (); System.out.println ("Consumed:" +MT); Try{Thread.Sleep (int) (Math.random () *1000)); }Catch(Interruptedexception ex) {ex.printstacktrace (); } } }}
Thread----Lock (producer, consumer)