package Ġru . job 4 j . concurrency Ċ Ċ import Ġorg . hamcrest . Core Matchers .` is ` Ċ import Ġorg . hamcrest . Matcher Assert . assertThat Ċ import Ġorg . junit . jupiter . api . Test Ċ Ċ internal Ġclass ĠCon currency First Last List Test Ġ{ ĊĠĠĠ Ġprivate Ġval Ġstorage Ġ= ĠCon currency First Last List < Int >() ĊĊĠĠĠ Ġinner Ġclass ĠStorage Add Ġconstructor ( private Ġvar Ġstorage : ĠCon currency First Last List < Int >, Ġprivate Ġval Ġvalue : ĠInt ) Ġ: ĠThread () Ġ{ ĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġrun () Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthis . storage . offer ( value ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġinner Ġclass ĠStorage Poll Ġconstructor ( private Ġvar Ġstorage : ĠCon currency First Last List < Int >) Ġ: ĠThread () Ġ{ ĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġrun () Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthis . storage . poll () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test () ĊĠĠĠ Ġfun Ġwhen Add Then Concurrency () Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġa Ġ= ĠStorage Add ( storage , Ġ 1 ) ĊĠĠĠĠĠĠĠ Ġval Ġb Ġ= ĠStorage Add ( storage , Ġ 2 ) ĊĠĠĠĠĠĠĠ Ġval Ġc Ġ= ĠStorage Poll ( storage ) ĊĠĠĠĠĠĠĠ Ġval Ġd Ġ= ĠStorage Add ( storage , Ġ 3 ) ĊĠĠĠĠĠĠĠ Ġval Ġe Ġ= ĠStorage Add ( storage , Ġ 4 ) ĊĠĠĠĠĠĠĠ Ġstorage . poll () ĊĠĠĠĠĠĠĠ Ġa . start () ĊĠĠĠĠĠĠĠ Ġb . start () ĊĠĠĠĠĠĠĠ Ġc . start () ĊĠĠĠĠĠĠĠ Ġprintln ( storage Ġ+ Ġ" Ġ") ĊĠĠĠĠĠĠĠ Ġstorage . poll () ĊĠĠĠĠĠĠĠ Ġd . start () ĊĠĠĠĠĠĠĠ Ġe . start () ĊĠĠĠĠĠĠĠ Ġa . join () ĊĠĠĠĠĠĠĠ Ġb . join () ĊĠĠĠĠĠĠĠ Ġc . join () ĊĠĠĠĠĠĠĠ Ġd . join () ĊĠĠĠĠĠĠĠ Ġe . join () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġseveral Threads Work With Collection () Ġ{ ĊĠĠĠĠĠĠĠ Ġfor Ġ( i Ġin Ġ 0 .. 1 9 9 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġt Ġ= Ġobject Ġ: ĠThread () Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġrun () Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfor Ġ( j Ġin Ġ 0 .. 9 9 9 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġstorage . offer ( 1 0 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġt . start () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġt . join () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġvar Ġsum Ġ= Ġ 0 ĊĠĠĠĠĠĠĠ Ġfor Ġ( an Int Ġin Ġstorage ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsum Ġ+= Ġan Int ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ ĠassertThat ( sum , Ġ` is `( 2 0 0 0 0 0 0 )) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġgiven List CreatedBy Var ArgsConstructor When Add Items Then Items Are Reach able () Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġints Ġ= ĠCon currency First Last List ( 5 , Ġ 1 0 ) ĊĠĠĠĠĠĠĠ ĠassertThat ( ints . get ( 0 ), Ġ` is `( 5 )) ĊĠĠĠĠĠĠĠ ĠassertThat ( ints . get ( 1 ), Ġ` is `( 1 0 )) ĊĠĠĠĠĠĠĠ ĠassertThat ( ints . size (), Ġ` is `( 2 )) ĊĠĠĠĠĠĠĠ Ġints . offer ( 1 5 ) ĊĠĠĠĠĠĠĠ ĠassertThat ( ints . get ( 2 ), Ġ` is `( 1 5 )) ĊĠĠĠĠĠĠĠ ĠassertThat ( ints . size (), Ġ` is `( 3 )) ĊĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test () ĊĠĠĠ Ġfun Ġgiven Iterator When Go es Over Border Then Throw Exception () Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġints Ġ= ĠCon currency First Last List ( 5 , Ġ 6 , Ġ 3 ) ĊĠĠĠĠĠĠĠ Ġval Ġit Ġ= Ġints . iterator () ĊĠĠĠĠĠĠĠ ĠassertThat ( it . hasNext (), Ġ` is `( true )) ĊĠĠĠĠĠĠĠ ĠassertThat ( it . next (), Ġ` is `( 5 )) ĊĠĠĠĠĠĠĠ ĠassertThat ( it . next (), Ġ` is `( 6 )) ĊĠĠĠĠĠĠĠ ĠassertThat ( it . next (), Ġ` is `( 3 )) ĊĠĠĠĠĠĠĠ ĠassertThat ( it . hasNext (), Ġ` is `( false )) ĊĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġit . next () ĊĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e Ġ: ĠNoSuch ElementException ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġprintln (" no Ġsuch ") ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠ Ġ} Ċ } ĊĊ