Sie sind auf Seite 1von 5

7/14/13

Need help in code regarding join() (Threads forum at JavaRanch)

A friendly place for programming greenhorns!

Big Moose Saloon


Search

Java FAQ

Recent Topics

Register / Login

JavaRanch Java Forums Java Threads and Synchronization

Author
ashwin bhawsar Ranch Hand Joined: Mar 16, 2011 Posts: 62
I like...

Need help in code regarding join()


posted 6/8/2012 10:26:26 AM

Currently iam learning Threads topic from Kathy Sierra. I am trying to write a typical producer-consumer code that makes use of the join() method of Thread. This is what i want to accomplish : 1> There will be 3 threads Thread_A, Thread_B and Thread_C. 2> Thread_A's job is to continuously take input from the User from console and store it in an ArrayList. The input will be in form of positive integer numbers ( eg: 2, 3, 100, 50 ....). 3> Thraed_B's job is to iterate through the array list and read these values one-by-one and store it in a variable. Thraed_B will not read the next values unless Thread_C has finished its job.( Thread_B has join() on Thread_C) 4> Thread_C's job is to print '#' character in a File as per the values in the variable. So if the values is say 20, then Thread_C will print '#' 20 times in the file. To summarize, if the user has entered (20, 5, 10, 50) then Thread_C should print '#' 20 times, then 5 times then 10 times..... I am not getting where to start the Thread_C.

view plain

c opy to c lipboard

print

N ote: T ext c ontent in the c ode bloc ks is automatic ally word- wrapped

0 1 . 0 2 . 0 3 . 0 4 . 0 5 . 0 6 . 0 7 . 0 8 . 0 9 . 1 0 . 1 1 . 1 2 . 1 3 . 1 4 . 1 5 . 1 6 . 1 7 . 1 8 . 1 9 .

i m p o r tj a v a . i o . * ; i m p o r tj a v a . i o . * ; i m p o r tj a v a . u t i l . * ; / / -T h r e a d _ A :T a k eu s e ri n p u t c l a s sU s e r T h r e a di m p l e m e n t sR u n n a b l e{ L i s t < I n t e g e r >i n s t r u c t i o n L i s t ; U s e r T h r e a d ( L i s t < I n t e g e r >i n s t r u c t i o n L i s t ){ t h i s . i n s t r u c t i o n L i s t=i n s t r u c t i o n L i s t ; } / /t a k ea ni n p u tf r o mt h eu s e ra n da di ta sa ni n s t r u c t i o n p u b l i cv o i dt a k e U s e r I n p u t ( ){ B u f f e r e d R e a d e rb r=n e wB u f f e r e d R e a d e r ( n e wI n p u t S t r e a m R e a d e r ( S y s t e m . i n ) ) ; i n ti n s t r u c t i o n ; t r y{ i n s t r u c t i o n=I n t e g e r . p a r s e I n t ( b r . r e a d L i n e ( ) ) ;

www.coderanch.com/t/583455/threads/java/code-join

1/5

7/14/13

1 9 . 2 0 . 2 1 . 2 2 . 2 3 . 2 4 . 2 5 . 2 6 . 2 7 . 2 8 . 2 9 . 3 0 . 3 1 . 3 2 . 3 3 . 3 4 . 3 5 . 3 6 . 3 7 . 3 8 . 3 9 . 4 0 . 4 1 . 4 2 . 4 3 . 4 4 . 4 5 . 4 6 . 4 7 . 4 8 . 4 9 . 5 0 . 5 1 . 5 2 . 5 3 . 5 4 . 5 5 . 5 6 . 5 7 . 5 8 . 5 9 . 6 0 . 6 1 . 6 2 . 6 3 . 6 4 . 6 5 . 6 6 . 6 7 . 6 8 . 6 9 . 7 0 . 7 1 . 7 2 . 7 3 . 7 4 . 7 5 . 7 6 . 7 7 . 7 8 . 7 9 . 8 0 . 8 1 . 8 2 . 8 3 . 8 4 . 8 5 . 8 6 . 8 7 . 8 8 . 8 9 . 9 0 . 9 1 . 9 2 . 9 3 . 9 4 . 9 5 . 9 6 . 9 7 . 9 8 . 9 9 . 1 0 0 . 1 0 1 . 1 0 2 . 1 0 3 . 1 0 4 . 1 0 5 . 1 0 6 .

i n s t r u c t i o n=I n t e g e r . p a r s e I n t ( b r . r e a d L i n e ( ) ) ; / /A d dt h ei n p u tt ot h eA r r a y L i s t i n s t r u c t i o n L i s t . a d d ( i n s t r u c t i o n ) ; }c a t c h( I O E x c e p t i o ne ){ e . p r i n t S t a c k T r a c e ( ) ; }c a t c h( N u m b e r F o r m a t E x c e p t i o ne ){ S y s t e m . o u t . p r i n t l n ( " P l e a s ee n t e ran u m b e r " ) ; } } p u b l i cv o i dr u n ( ){ / /c o n t i n u o u s l yt a k eu s e ri n p u ti nf o r mo fn u m b e r s w h i l e( t r u e ){ t a k e U s e r I n p u t ( ) ; } } }

Need help in code regarding join() (Threads forum at JavaRanch)

/ /T h r e a d _ B :I t e r a t et h eA r r a y L i s t c l a s sR e a d I n s t r u c t i o ni m p l e m e n t sR u n n a b l e{ s t a t i cL i s t < I n t e g e r >i n s t r u c t i o n s ; R e a d I n s t r u c t i o n ( L i s t < I n t e g e r >i n s t r u c t i o n L i s t ){ t h i s . i n s t r u c t i o n s=i n s t r u c t i o n L i s t ; } p u b l i cv o i dr u n ( ){ W r i t e T o F i l em=n e wW r i t e T o F i l e ( ) ; / / s t a r tt h et h r e a d _ C T h r e a dt h r e a d _ C=n e wT h r e a d ( m ," T h r e a d _ C " ) ; t h r e a d _ C . s t a r t ( ) ; w h i l e( t r u e ){ / /I t e r a t e f o r( i n ti=0 ;i<i n s t r u c t i o n s . s i z e ( ) ;i + + ){ i n ti n s t r u c t i o n=i n s t r u c t i o n s . g e t ( i ) ; / /S t o r ei ts ot h a tt h r e a d _ Cc a nr e a di t S t o r a g e C l a s s . s e t V a l u e ( i n s t r u c t i o n ) ; i n s t r u c t i o n s . r e m o v e ( i ) ; t r y{ / /i t e r a t et ot h en e x tv a l u eo fL i s to n l ya f t e rT h r e a d _ Ch a s / /f i n i s h e d / /i t sj o b . t h r e a d _ C . j o i n ( ) ; }c a t c h( I n t e r r u p t e d E x c e p t i o ne ){ e . p r i n t S t a c k T r a c e ( ) ; } } } } } / /-T h r e a d _ Cw r i t e sc h a r a c t e r' # 't oF i l ec l a s sW r i t e T o F i l ei m p l e m e n t sR u n n a b l e{ B u f f e r e d W r i t e rb f ; W r i t e T o F i l e ( ){ t r y{ F i l ef=n e wF i l e ( " c : / m a c h i n e F i l e . t x t " ) ; F i l e W r i t e rf w=n e wF i l e W r i t e r ( f ) ; b f=n e wB u f f e r e d W r i t e r ( f w ) ; }c a t c h( I O E x c e p t i o ne ){ e . p r i n t S t a c k T r a c e ( ) ; } } p u b l i cv o i dr u n ( ){ w h i l e ( t r u e ) { i f ( S t o r a g e C l a s s . g e t V a l u e ( ) > 0 ) { t r y{ b f . a p p e n d ( " L o o pc o u n t : "+S t o r a g e C l a s s . g e t V a l u e ( )+" \ n " ) ; f o r( i n ti=S t o r a g e C l a s s . g e t V a l u e ( ) ;i>0 ;i ){ b f . a p p e n d ( " # " ) ; } T h r e a d . s l e e p ( 5 0 0 0 ) ;/ / S l e e pf o rs o m et i m e . b f . a p p e n d ( " \ n " ) ; b f . f l u s h ( ) ; S y s t e m . o u t . p r i n t l n ( " W r i t t e n : "+S t o r a g e C l a s s . g e t V a l u e ( ) ) ; S t o r a g e C l a s s . s e t V a l u e ( 0 ) ; }c a t c h( I O E x c e p t i o ne ){ e . p r i n t S t a c k T r a c e ( ) ;

www.coderanch.com/t/583455/threads/java/code-join

2/5

7/14/13
1 0 6 . 1 0 7 . 1 0 8 . 1 0 9 . 1 1 0 . 1 1 1 . 1 1 2 . 1 1 3 . 1 1 4 . 1 1 5 . 1 1 6 . 1 1 7 . 1 1 8 . 1 1 9 . 1 2 0 . 1 2 1 . 1 2 2 . 1 2 3 . 1 2 4 . 1 2 5 . 1 2 6 . 1 2 7 . 1 2 8 . 1 2 9 . 1 3 0 . 1 3 1 . 1 3 2 . 1 3 3 . 1 3 4 . 1 3 5 . 1 3 6 . 1 3 7 . 1 3 8 . 1 3 9 . 1 4 0 . 1 4 1 . 1 4 2 . 1 4 3 . 1 4 4 . 1 4 5 . 1 4 6 . 1 4 7 .

Need help in code regarding join() (Threads forum at JavaRanch)


e . p r i n t S t a c k T r a c e ( ) ; }c a t c h( I n t e r r u p t e d E x c e p t i o ne ){ e . p r i n t S t a c k T r a c e ( ) ; } } } } } / /-T h r e a d _ Bs t o r e sv a l u ef o rT h r e a d _ Cc l a s sS t o r a g e C l a s s{ s t a t i ci n tv a l u e ; p u b l i cs t a t i cs y n c h r o n i z e dv o i ds e t V a l u e ( i n tm y V a l u e ){ v a l u e=m y V a l u e ; } p u b l i cs t a t i cs y n c h r o n i z e di n tg e t V a l u e ( ){ r e t u r nv a l u e ; } } / /-M a i nC l a s sp u b l i cc l a s sP r a c C l a s s{ s t a t i cL i s t < I n t e g e r >u s e r I n s t r u c t i o n=n e wA r r a y L i s t < I n t e g e r > ( ) ; p u b l i cs t a t i cv o i dm a i n ( S t r i n g [ ]a r g s ){ / /T h r e a d _ Af o rc o n t i n u o u s l yg e t t i n gt h eu s e ri n p u t U s e r T h r e a du t=n e wU s e r T h r e a d ( u s e r I n s t r u c t i o n ) ; T h r e a dt h r e a d _ A=n e wT h r e a d ( u t ," T h r e a d _ A " ) ; t h r e a d _ A . s t a r t ( ) ; / /T h r e a d _ Bf o rr e a d i n gt h ei n s t r u c t i o no n eb yo n ea n dp a s s i n gi tt o / /m a c h i n e R e a d I n s t r u c t i o nr i=n e wR e a d I n s t r u c t i o n ( u s e r I n s t r u c t i o n ) ; T h r e a dt h r e a d _ B=n e wT h r e a d ( r i ," T h r e a d _ B " ) ; t h r e a d _ B . s t a r t ( ) ; } }

ashwin bhawsar Ranch Hand Joined: Mar 16, 2011 Posts: 62


I like...

posted 6/8/2012 10:40:54 AM

I want to keep thread_C running, but doing so thread_B will never move forward as thread_C's run is in while loop, so it will never die.

ashwin bhawsar Ranch Hand Joined: Mar 16, 2011 Posts: 62


I like...

posted 6/8/2012 5:18:27 PM

The approach was wrong. The solution to the problem can be achieved using the wait() and notify() methods. I had put an infinite loop in Thread_C to continually monitor if the Thread_B has written some value, but doing so Thread_C was not exiting the run method and so not going "dead". As Thread_B had join over Thread_C, Thread _B could not go further unless Thread_C was not over and this was not happening. To achieve the goal i have used the wait() and notify() methods. Below is a new code that will make clear how to achieve the goal using wait() and notify() methods. ( Note : The code now does not take any input from the user, instead the producer produce the values)

view plain

c opy to c lipboard

print

N ote: T ext c ontent in the c ode bloc ks is automatic ally word- wrapped

0 1 . 0 2 . 0 3 . 0 4 . 0 5 . 0 6 . 0 7 . 0 8 .

i m p o r tj a v a . i o . * ; / / P r o g r a m:t h i sp r o g r a mw i l lc r a t e2t h r e a d s ,P r o d u c e ra n daC o n s u m e rt h r e a d . / / T h ep r o d u c e rt h r e a dw i l li t e r a t et h r o u g hal o o pa n dw r i t ev a l u e st oac o m m o nr e s o u c e / / w h i c hi st h e nr e a db yt h ec o n s u m e ra n dw r i t t e nt ot h eF i l e .T h ep r o d u c e rw i l lw a i tt op r o d u c e / / t h en e x tv a l u eu n l e s si tg e t st h en o t i f i c a t i o nf r o mt h ec o n s u m e rt h r e a d . / / C o m m o nr e s o u r c ew i l lb es h a r e db e t w e e nt h eP r o d u c e ra n dC o n s u m e rt h r e a d s

www.coderanch.com/t/583455/threads/java/code-join

3/5

7/14/13
0 9 . 1 0 . 1 1 . 1 2 . 1 3 . 1 4 . 1 5 . 1 6 . 1 7 . 1 8 . 1 9 . 2 0 . 2 1 . 2 2 . 2 3 . 2 4 . 2 5 . 2 6 . 2 7 . 2 8 . 2 9 . 3 0 . 3 1 . 3 2 . 3 3 . 3 4 . 3 5 . 3 6 . 3 7 . 3 8 . 3 9 . 4 0 . 4 1 . 4 2 . 4 3 . 4 4 . 4 5 . 4 6 . 4 7 . 4 8 . 4 9 . 5 0 . 5 1 . 5 2 . 5 3 . 5 4 . 5 5 . 5 6 . 5 7 . 5 8 . 5 9 . 6 0 . 6 1 . 6 2 . 6 3 . 6 4 . 6 5 . 6 6 . 6 7 . 6 8 . 6 9 . 7 0 . 7 1 . 7 2 . 7 3 . 7 4 . 7 5 . j e c t 7 6 . 7 7 . 7 8 . 7 9 . 8 0 . 8 1 . 8 2 . 8 3 . 8 4 . 8 5 . 8 6 . 8 7 . 8 8 . 8 9 . 9 0 . 9 1 . 9 2 .

Need help in code regarding join() (Threads forum at JavaRanch)


/ / P r o d u c e rw i l lw r i t ev a l u e st oi ta n dt h ec o n s u m e rw i l lc o n s u m ev a l u e sf r o mi t . c l a s sC o m m o n R e s o u r c e { p r i v a t ei n tv a l u e ; p u b l i ci n tg e t V a l u e ( ) { r e t u r nv a l u e ; } p u b l i cv o i ds e t V a l u e ( i n tv ) { t h i s . v a l u e = v ; } } / /P r o d u c e rw i l lr u nal o o pt h r o u g h0t o5 0 c l a s sP r o d u c e ri m p l e m e n t sR u n n a b l e { C o m m o n R e s o u r c er e s o u r c e ; P r o d u c e r ( C o m m o n R e s o u r c ec o m m o n R e s o u r c e ) { t h i s . r e s o u r c e = c o m m o n R e s o u r c e ; } p u b l i cv o i dr u n ( ) { f o r ( i n ti = 0 ; i < 5 0 ; i + + ) { s y n c h r o n i z e d( r e s o u r c e ){ / / i t e r a t ef r o m0t o5 0o n e b y o n ea n ds t o r ei ti nac o m m o nr e s o u r c e r e s o u r c e . s e t V a l u e ( i ) ; t r y { / /w a i tt i l lt h ec o n s u m e rc o n s u m e st h ev a l u ea n dw r i t e si tt oaf i l e / /i . ew a i tu n t i lw eg e tn o t i f i c a t i o nf r o mt h ec o n s u m e ro ft h er e s o u r c eo b j e c t r e s o u r c e . w a i t ( ) ; } c a t c h ( I n t e r r u p t e d E x c e p t i o ne ) { e . p r i n t S t a c k T r a c e ( ) ; } } } } } c l a s sC o n s u m e ri m p l e m e n t sR u n n a b l e { C o m m o n R e s o u r c er e s o u r c e ; F i l ef ; F i l e W r i t e rf w ; B u f f e r e d W r i t e rb w ; C o n s u m e r ( C o m m o n R e s o u r c ec o m m o n R e s o u r c e ) { t h i s . r e s o u r c e = c o m m o n R e s o u r c e ; t r y { / /F i l et ow h i c ht h ec o n s u m e rw i l lw r i t et h ev a l u e si th a sc o n s u m e d f=n e wF i l e ( " C : / m a c h i n e w r i t e r . t x t " ) ; f w=n e wF i l e W r i t e r ( f ) ; b w=n e wB u f f e r e d W r i t e r ( f w ) ; } c a t c h ( E x c e p t i o ne ) { e . p r i n t S t a c k T r a c e ( ) ; } } p u b l i cv o i dr u n ( ) { w h i l e ( t r u e ) { s y n c h r o n i z e d( r e s o u r c e ){ i f ( r e s o u r c e . g e t V a l u e ( ) ! = 0 ) { t r y { S y s t e m . o u t . p r i n t l n ( r e s o u r c e . g e t V a l u e ( ) ) ; b w . w r i t e ( " \ nL o o p : " + r e s o u r c e . g e t V a l u e ( ) ) ; / /C o n s u m et h ev a l u ew r i t t e nb yp r o d u c e ri nt h ec o m m o nr e s o u r c eo b f o r ( i n ti = 0 ; i < r e s o u r c e . g e t V a l u e ( ) ; i + + ) { b w . w r i t e ( " # " ) ; } b w . f l u s h ( ) ; } c a t c h ( I O E x c e p t i o ne ) { e . p r i n t S t a c k T r a c e ( ) ; } } / / N o t i f yt ot h ep r o d u c e rt h a th ev a l u ei sc o n s u m e da n dw r i t t e nt ot h ef i l e r e s o u r c e . n o t i f y ( ) ; r e s o u r c e . s e t V a l u e ( 0 ) ; } } } }

www.coderanch.com/t/583455/threads/java/code-join

4/5

7/14/13
9 2 . 9 3 . 9 4 . 9 5 . 9 6 . 9 7 . 9 8 . 9 9 . 1 0 0 . 1 0 1 . 1 0 2 . 1 0 3 . 1 0 4 . 1 0 5 . 1 0 6 . 1 0 7 . 1 0 8 .

Need help in code regarding join() (Threads forum at JavaRanch)


p u b l i cc l a s sT h r e a d C l a s s { p u b l i cs t a t i cv o i dm a i n ( S t r i n g [ ]a r g s ){ C o m m o n R e s o u r c ec o m m o n R e s o u r c e=n e wC o m m o n R e s o u r c e ( ) ; / / c r e a t et h eP r d u c e rt h r e a d P r o d u c e rp r o d u c e r=n e wP r o d u c e r ( c o m m o n R e s o u r c e ) ; T h r e a dp r o d u c e r T h r e a d=n e wT h r e a d ( p r o d u c e r , " P R O D U C E R " ) ; p r o d u c e r T h r e a d . s t a r t ( ) ; / / c r e a t et h ec o n s u m e rt h r e a d C o n s u m e rc o n s u m e r=n e wC o n s u m e r ( c o m m o n R e s o u r c e ) ; T h r e a dc o n s u m e r T h r e a d=n e wT h r e a d ( c o n s u m e r , " C O N S U M E R " ) ; c o n s u m e r T h r e a d . s t a r t ( ) ; } }

Granny's Programming Pearls "inside of every large program is a small program struggling to get out" JavaRanch.com/granny.jsp

subject: Need help in code regarding join()

Similar Threads JVM and Thread Help Thread problem proble in converting ArrayList<String> to ArrayList<Object> cannot make static reference to non-static Integer [ A good finding ] - User & Deamon Threads
All times above are in your local time zone & format.T he current ranch time (not your local time) is Jul 14, 2013 08:27:25 .

Contact Us | Powered by JForum |

C opyright 1998-2013 Paul W he aton

www.coderanch.com/t/583455/threads/java/code-join

5/5

Das könnte Ihnen auch gefallen