/** Ċ Ġ* ĠCopyright Ġ 2 0 1 0 Ġ- Ġ 2 0 1 9 ĠJetBrains Ġs . r . o . Ċ Ġ* Ċ Ġ* ĠLicensed Ġunder Ġthe ĠApache ĠLicense , ĠVersion Ġ 2 . 0 Ġ( the Ġ" License "); Ċ Ġ* Ġyou Ġmay Ġnot Ġuse Ġthis Ġfile Ġexcept Ġin Ġcompliance Ġwith Ġthe ĠLicense . Ċ Ġ* ĠYou Ġmay Ġobtain Ġa Ġcopy Ġof Ġthe ĠLicense Ġat Ċ Ġ* Ċ Ġ* Ġhttp :// www . apache . org / licenses / LICENSE - 2 . 0 Ċ Ġ* Ċ Ġ* ĠUnless Ġrequired Ġby Ġapplicable Ġlaw Ġor Ġagreed Ġto Ġin Ġwriting , Ġsoftware Ċ Ġ* Ġdistributed Ġunder Ġthe ĠLicense Ġis Ġdistributed Ġon Ġan Ġ" AS ĠIS " ĠBASIS , Ċ Ġ* ĠWITHOUT ĠWARRANTIES ĠOR ĠCONDITIONS ĠOF ĠANY ĠKIND , Ġeither Ġexpress Ġor Ġimplied . Ċ Ġ* ĠSee Ġthe ĠLicense Ġfor Ġthe Ġspecific Ġlanguage Ġgoverning Ġpermissions Ġand Ċ Ġ* Ġlimitations Ġunder Ġthe ĠLicense . Ċ Ġ*/ Ċ package Ġjet brains . ex od us . core . execution Ċ Ċ import Ġjet brains . ex od us . core . data Structures . Priority Ċ import Ġorg . junit . Assert Ċ import Ġorg . junit . Before Ċ import Ġorg . junit . Test Ċ Ċ open Ġclass ĠJob Processor Test Ġ{ ĊĊĠĠĠ Ġprotected Ġlateinit Ġvar Ġprocessor : ĠJob Processor ĊĊĠĠĠ Ġprotected Ġopen Ġfun Ġcreate Processor (): ĠJob Processor Ġ= ĠThread Job Processor (" Test ĠJob ĠProcessor ") ĊĊĠĠĠ Ġ@ Before ĊĠĠĠ Ġopen Ġfun ĠsetUp () Ġ{ ĊĠĠĠĠĠĠĠ ĠSystem . setProperty ( Job Processor Queue Adapter . CON CURRENT _ QUEUE _ PROPERTY , Ġ" false ") ĊĠĠĠĠĠĠĠ Ġprocessor Ġ= Ġcreate Processor (). apply Ġ{ Ġstart () Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġsleep () Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġprocessor Ġ= Ġprocessor Ġas ? ĠThread Job Processor Ġ?: Ġreturn ĊĠĠĠĠĠĠĠ Ġval Ġticks Ġ= ĠSystem . currentTimeMillis () ĊĠĠĠĠĠĠĠ Ġval Ġsleep Ticks Ġ= Ġ 2 0 0 0 L ĊĠĠĠĠĠĠĠ ĠSleep Job ( processor , Ġsleep Ticks ) ĊĠĠĠĠĠĠĠ Ġprocessor . queue Finish () ĊĠĠĠĠĠĠĠ Ġprocessor . wait Until Finished () ĊĠĠĠĠĠĠĠ Ġval Ġcurrent Ġ= ĠSystem . currentTimeMillis () ĊĠĠĠĠĠĠĠ ĠAssert . assertTrue (" Current Ġtime Ġ= Ġ$ current , Ġticks Ġ= Ġ$ ticks ", ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcurrent Ġ- Ġsleep Ticks Ġ>= Ġticks ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġtest WaitFor Jobs () Ġ{ ĊĠĠĠĠĠĠĠ Ġfor Ġ( i Ġin Ġ 0 .. 9 9 ) Ġ{ Ġ// Ġthis Ġshould Ġbe Ġfast Ġwhen Ġeverything Ġworks Ġproperly ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġtime Ġ= ĠSystem . currentTimeMillis () ĊĠĠĠĠĠĠĠĠĠĠĠ ĠIncrement Job ( processor , Ġ 1 , ĠPriority . lowest ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġprocessor . waitFor Jobs ( 1 0 0 0 ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtime Ġ= ĠSystem . currentTimeMillis () Ġ- Ġtime ĊĠĠĠĠĠĠĠĠĠĠĠ ĠAssert . assertTrue (" Waiting Ġtook : Ġ$ time Ġon Ġiteration Ġ$ i ", Ġtime Ġ< Ġ 5 0 0 ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġtest WaitFor Timed Jobs () Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġprocessor Ġ= Ġprocessor Ġas ? ĠThread Job Processor Ġ?: Ġreturn ĊĠĠĠĠĠĠĠ Ġfor Ġ( i Ġin Ġ 0 .. 9 ) Ġ{ Ġ// Ġthis Ġshould Ġbe Ġfast Ġwhen Ġeverything ĠwaitFor Jobs Ġworks Ġproperly ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġtime Ġ= ĠSystem . currentTimeMillis () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġprocessor . queue In ( Increment Job ( processor , Ġ 1 ), Ġ 1 0 0 ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġprocessor . waitFor Timed Jobs ( 1 0 0 0 ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtime Ġ= ĠSystem . currentTimeMillis () Ġ- Ġtime ĊĠĠĠĠĠĠĠĠĠĠĠ ĠAssert . assertTrue (" Waiting Ġtook : Ġ$ time Ġon Ġiteration Ġ$ i ", Ġtime Ġ< Ġ 5 0 0 ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġtest Suspend () Ġ{ ĊĠĠĠĠĠĠĠ Ġprocessor . suspend () ĊĠĠĠĠĠĠĠ Ġcount Ġ= Ġ 0 ĊĠĠĠĠĠĠĠ Ġprocessor . queue ( Increment Job ( processor , Ġ 1 )) ĊĠĠĠĠĠĠĠ Ġsleep ( 2 0 0 ) ĊĠĠĠĠĠĠĠ ĠAssert . assertEquals ( 0 , Ġcount ) ĊĠĠĠĠĠĠĠ Ġprocessor . resume () ĊĠĠĠĠĠĠĠ Ġprocessor . waitFor Jobs ( 1 0 ) ĊĠĠĠĠĠĠĠ ĠAssert . assertEquals ( 1 , Ġcount ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġtest Suspend 2 () Ġ{ ĊĠĠĠĠĠĠĠ Ġ// val Ġprocessor Ġ= Ġprocessor Ġas ? ĠThread Job Processor Ġ?: Ġreturn ĊĠĠĠĠĠĠĠ Ġprocessor . suspend () ĊĠĠĠĠĠĠĠ Ġcount Ġ= Ġ 0 ĊĠĠĠĠĠĠĠ Ġprocessor . queue ( Increment Job ( processor , Ġ 1 )) ĊĠĠĠĠĠĠĠ Ġsleep ( 2 0 0 ) ĊĠĠĠĠĠĠĠ ĠAssert . assertEquals ( 0 , Ġcount ) ĊĠĠĠĠĠĠĠ Ġprocessor . resume () ĊĠĠĠĠĠĠĠ Ġval Ġr Ġ= ĠResume Runnable ( processor ) ĊĠĠĠĠĠĠĠ Ġval Ġres um er Ġ= ĠThread ( r ) ĊĠĠĠĠĠĠĠ Ġres um er . start () ĊĠĠĠĠĠĠĠ Ġprocessor . waitFor Jobs ( 1 0 ) ĊĠĠĠĠĠĠĠ ĠAssert . assertEquals ( 1 , Ġcount ) ĊĠĠĠĠĠĠĠ Ġsleep ( 2 0 0 ) ĊĠĠĠĠĠĠĠ Ġif Ġ( r . state Ġ== ĠResume Runnable State . INITIAL ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġres um er . interrupt () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsleep ( 2 0 0 ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġstate Ġ= Ġr . state ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( state Ġ!= ĠResume Runnable State . RE SU MED ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠAssert . fail (" Can 't Ġresume Ġin Ġother Ġthread : Ġ$ state ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġtest Suspend 3 () Ġ{ ĊĠĠĠĠĠĠĠ Ġ// val Ġprocessor Ġ= Ġprocessor Ġas ? ĠThread Job Processor Ġ?: Ġreturn ĊĠĠĠĠĠĠĠ Ġprocessor . suspend () ĊĠĠĠĠĠĠĠ Ġval Ġr Ġ= ĠS uspend Runnable ( processor ) ĊĠĠĠĠĠĠĠ Ġval Ġsus p ender Ġ= ĠThread ( r ) ĊĠĠĠĠĠĠĠ Ġsus p ender . start () ĊĠĠĠĠĠĠĠ Ġsleep ( 2 0 0 ) ĊĠĠĠĠĠĠĠ Ġif Ġ( r . state Ġ== ĠS uspend Runnable State . INITIAL ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsus p ender . interrupt () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsleep ( 2 0 0 ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġstate Ġ= Ġr . state ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( state Ġ!= ĠS uspend Runnable State . SUS PEN DED ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠAssert . fail (" Can 't Ġsuspend Ġin Ġother Ġthread : Ġ$ state ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġtest Suspend 4 () Ġ{ ĊĠĠĠĠĠĠĠ Ġ// val Ġprocessor Ġ= Ġprocessor Ġas ? ĠThread Job Processor Ġ?: Ġreturn ĊĠĠĠĠĠĠĠ Ġfor Ġ( i Ġin Ġ 0 .. 9 9 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġprocessor . suspend () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġprocessor . resume () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġtest Suspend 5 () Ġ{ ĊĠĠĠĠĠĠĠ Ġ// val Ġprocessor Ġ= Ġprocessor Ġas ? ĠThread Job Processor Ġ?: Ġreturn ĊĠĠĠĠĠĠĠ Ġfor Ġ( i Ġin Ġ 0 .. 9 9 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġprocessor . suspend () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġprocessor . suspend () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġprocessor . resume () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġprocessor . suspend () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġequal Jobs () Ġ{ ĊĠĠĠĠĠĠĠ ĠSleep Job ( processor , Ġ 1 0 0 ) ĊĠĠĠĠĠĠĠ ĠAlways Equal Job ( processor ) ĊĠĠĠĠĠĠĠ Ġfor Ġ( i Ġin Ġ 0 .. 9 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠAssert . assertFalse ( Always Equal Job ( processor ). was Queued ()) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġsleep ( 2 0 0 ) ĊĠĠĠĠĠĠĠ ĠAssert . assertTrue ( Always Equal Job ( processor ). was Queued ()) ĊĠĠĠĠĠĠĠ Ġprocessor . finish () ĊĠĠĠĠĠĠĠ Ġ// Ġdo Ġnot Ġqueue Ġafter Ġprocessor Ġhas Ġfinished ĊĠĠĠĠĠĠĠ ĠAssert . assertFalse ( Always Equal Job ( processor ). was Queued ()) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġpriority Order () Ġ{ ĊĠĠĠĠĠĠĠ Ġcount Ġ= Ġ 0 ĊĠĠĠĠĠĠĠ Ġval Ġjob Ġ= ĠAc qu iring Latch Job ( processor ) ĊĠĠĠĠĠĠĠ ĠIncrement Job ( processor , Ġ 1 ) ĊĠĠĠĠĠĠĠ ĠSleep Job ( processor , Ġ 3 0 0 ) ĊĠĠĠĠĠĠĠ ĠIncrement Job ( processor , Ġ 2 , ĠPriority . above _ normal ) ĊĠĠĠĠĠĠĠ ĠSleep Job ( processor , Ġ 3 0 0 , ĠPriority . above _ normal ) ĊĠĠĠĠĠĠĠ ĠIncrement Job ( processor , Ġ 3 , ĠPriority . highest ) ĊĠĠĠĠĠĠĠ ĠSleep Job ( processor , Ġ 3 0 0 , ĠPriority . highest ) ĊĠĠĠĠĠĠĠ Ġjob . release () ĊĠĠĠĠĠĠĠ Ġsleep ( 2 0 0 ) ĊĠĠĠĠĠĠĠ ĠAssert . assertEquals ( 3 , Ġcount ) ĊĠĠĠĠĠĠĠ Ġsleep ( 3 0 0 ) ĊĠĠĠĠĠĠĠ ĠAssert . assertEquals ( 5 , Ġcount ) ĊĠĠĠĠĠĠĠ Ġsleep ( 3 0 0 ) ĊĠĠĠĠĠĠĠ ĠAssert . assertEquals ( 6 , Ġcount ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġpending Jobs () Ġ{ ĊĠĠĠĠĠĠĠ Ġcount Ġ= Ġ 0 ĊĠĠĠĠĠĠĠ Ġval Ġjob Ġ= ĠAc qu iring Latch Job ( processor ) ĊĠĠĠĠĠĠĠ ĠIncrement Job ( processor , Ġ 1 ) ĊĠĠĠĠĠĠĠ ĠSleep Job ( processor , Ġ 1 0 0 0 ) ĊĠĠĠĠĠĠĠ ĠIncrement Job ( processor , Ġ 2 , ĠPriority . above _ normal ) ĊĠĠĠĠĠĠĠ ĠSleep Job ( processor , Ġ 1 0 0 0 , ĠPriority . above _ normal ) ĊĠĠĠĠĠĠĠ ĠIncrement Job ( processor , Ġ 3 , ĠPriority . highest ) ĊĠĠĠĠĠĠĠ ĠSleep Job ( processor , Ġ 1 0 0 0 , ĠPriority . highest ) ĊĠĠĠĠĠĠĠ Ġ// Ġthe Ġfollowing Ġsleep () Ġis Ġnecessary Ġto Ġmake Ġsure Ġthat ĠAc qu iring Latch Job Ġis Ġbeen Ġexecuted ĊĠĠĠĠĠĠĠ Ġ// Ġotherwise Ġa Ġrace Ġcondition Ġis Ġpossible Ġresulting Ġin Ġprocessor . pending Jobs () Ġreturns Ġ 8 Ġinstead Ġof Ġ 7 ĊĠĠĠĠĠĠĠ Ġsleep ( 1 0 0 0 ) ĊĠĠĠĠĠĠĠ ĠAssert . assertEquals ( 7 , Ġprocessor . pending Jobs ()) ĊĠĠĠĠĠĠĠ Ġjob . release () ĊĠĠĠĠĠĠĠ Ġsleep ( 7 0 0 ) ĊĠĠĠĠĠĠĠ ĠAssert . assertEquals ( 5 , Ġprocessor . pending Jobs ()) ĊĠĠĠĠĠĠĠ Ġsleep ( 1 0 0 0 ) ĊĠĠĠĠĠĠĠ ĠAssert . assertEquals ( 3 , Ġprocessor . pending Jobs ()) ĊĠĠĠĠĠĠĠ Ġsleep ( 1 0 0 0 ) ĊĠĠĠĠĠĠĠ ĠAssert . assertEquals ( 1 , Ġprocessor . pending Jobs ()) ĊĠĠĠĠĠĠĠ Ġsleep ( 7 0 0 ) ĊĠĠĠĠĠĠĠ ĠAssert . assertEquals ( 0 , Ġprocessor . pending Jobs ()) ĊĠĠĠĠĠĠĠ ĠAssert . assertEquals ( 6 , Ġcount ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġqueue At Future () Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġprocessor Ġ= Ġprocessor Ġas ? ĠThread Job Processor Ġ?: Ġreturn ĊĠĠĠĠĠĠĠ Ġcount Ġ= Ġ 0 ĊĠĠĠĠĠĠĠ Ġprocessor . queue At ( Increment Job (), ĠSystem . currentTimeMillis () Ġ+ Ġ 2 0 0 ) ĊĠĠĠĠĠĠĠ Ġprocessor . queue At ( Increment Job ( 2 ), ĠSystem . currentTimeMillis () Ġ+ Ġ 4 0 0 ) ĊĠĠĠĠĠĠĠ Ġprocessor . queue At ( Increment Job ( 3 ), ĠSystem . currentTimeMillis () Ġ+ Ġ 6 0 0 ) ĊĠĠĠĠĠĠĠ ĠAssert . assertEquals ( 0 , Ġcount ) ĊĠĠĠĠĠĠĠ Ġsleep ( 3 0 0 ) ĊĠĠĠĠĠĠĠ ĠAssert . assertEquals ( 1 , Ġcount ) ĊĠĠĠĠĠĠĠ Ġsleep ( 2 0 0 ) ĊĠĠĠĠĠĠĠ ĠAssert . assertEquals ( 3 , Ġcount ) ĊĠĠĠĠĠĠĠ Ġsleep ( 2 0 0 ) ĊĠĠĠĠĠĠĠ ĠAssert . assertEquals ( 6 , Ġcount ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġqueue At Merge () Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġprocessor Ġ= Ġprocessor Ġas ? ĠThread Job Processor Ġ?: Ġreturn ĊĠĠĠĠĠĠĠ Ġcount Ġ= Ġ 0 ĊĠĠĠĠĠĠĠ Ġval Ġjob Ġ= ĠIncrement Job () ĊĠĠĠĠĠĠĠ Ġprocessor . queue At ( job , ĠSystem . currentTimeMillis () Ġ+ Ġ 2 0 0 ) ĊĠĠĠĠĠĠĠ Ġprocessor . queue At ( job , ĠSystem . currentTimeMillis () Ġ+ Ġ 4 0 0 ) ĊĠĠĠĠĠĠĠ Ġprocessor . queue At ( job , ĠSystem . currentTimeMillis () Ġ+ Ġ 6 0 0 ) ĊĠĠĠĠĠĠĠ Ġsleep ( 5 0 0 ) ĊĠĠĠĠĠĠĠ ĠAssert . assertEquals ( 0 , Ġcount ) ĊĠĠĠĠĠĠĠ Ġsleep ( 2 0 0 ) ĊĠĠĠĠĠĠĠ ĠAssert . assertEquals ( 1 , Ġcount ) ĊĠĠĠĠĠĠĠ Ġprocessor . queue At ( job , ĠSystem . currentTimeMillis () Ġ+ Ġ 6 0 0 ) ĊĠĠĠĠĠĠĠ Ġprocessor . queue At ( job , ĠSystem . currentTimeMillis () Ġ+ Ġ 1 0 0 ) ĊĠĠĠĠĠĠĠ Ġsleep ( 2 0 0 ) ĊĠĠĠĠĠĠĠ ĠAssert . assertEquals ( 2 , Ġcount ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġqueue In () Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġprocessor Ġ= Ġprocessor Ġas ? ĠThread Job Processor Ġ?: Ġreturn ĊĠĠĠĠĠĠĠ Ġcount Ġ= Ġ 0 ĊĠĠĠĠĠĠĠ Ġval Ġjob Ġ= ĠIncrement Job () ĊĠĠĠĠĠĠĠ Ġprocessor . queue In ( job , Ġ 2 0 0 ) ĊĠĠĠĠĠĠĠ Ġsleep ( 1 0 0 ) ĊĠĠĠĠĠĠĠ ĠAssert . assertEquals ( 0 , Ġcount ) ĊĠĠĠĠĠĠĠ Ġsleep ( 2 0 0 ) ĊĠĠĠĠĠĠĠ ĠAssert . assertEquals ( 1 , Ġcount ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġclass ĠAc qu iring Latch Job Ġinternal Ġconstructor ( processor : ĠJob Processor ) Ġ: ĠL atch Job () Ġ{ ĊĊĠĠĠĠĠĠĠ Ġinit Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġacquire () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠInterruptedException ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠThread . currentThread (). interrupt () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ ĠAssert . assertTrue ( processor . queue ( this , ĠPriority . highest )) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġexecute () Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġacquire () ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠ Ġ} ĊĊĠĠĠ Ġinternal Ġclass ĠSleep Job ( processor : ĠJob Processor , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġprivate Ġvar Ġticks : ĠLong , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpriority : ĠPriority Ġ= ĠPriority . normal ) Ġ: ĠJob ( processor , Ġpriority ) Ġ{ ĊĊĠĠĠĠĠĠĠ Ġinit Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠAssert . assertTrue ( was Queued ()) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġexecute () Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġprintln (" Sleep Job ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsleep ( ticks ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġinternal Ġclass ĠIncrement Job ( private Ġval Ġincrement : ĠInt Ġ= Ġ 1 ) Ġ: ĠJob () Ġ{ ĊĊĠĠĠĠĠĠĠ Ġinternal Ġconstructor ( processor : ĠJob Processor , Ġincrement : ĠInt , Ġpriority : ĠPriority Ġ= ĠPriority . normal ) Ġ: Ġthis ( increment ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠAssert . assertTrue ( processor . queue ( this , Ġpriority )) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġexecute () Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġbefore Ġ= ĠSystem . nano Time () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcount Ġ+= Ġincrement ĊĠĠĠĠĠĠĠĠĠĠĠ Ġprintln (" Increment Ġexecuted Ġin : Ġ" Ġ+ Ġ( System . nano Time () Ġ- Ġbefore ) Ġ+ Ġ" ns .") ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠAll Ġjobs Ġof Ġthis Ġtype Ġare Ġalways Ġequal ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġ@ Suppress (" Equals Or HashCode ") ĊĠĠĠ Ġprivate Ġclass ĠAlways Equal Job ( processor : ĠJob Processor ) Ġ: ĠJob ( processor ) Ġ{ ĊĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġis EqualTo ( job : ĠJob ): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġtrue ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġoverride Ġfun ĠhashCode (): ĠInt Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġ 0 ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġexecute () Ġ{} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġclass ĠResume Runnable ( private Ġval Ġprocessor : ĠJob Processor ) Ġ: ĠRunnable Ġ{ ĊĊĠĠĠĠĠĠĠ Ġ@ Volatile ĊĠĠĠĠĠĠĠ Ġvar Ġstate Ġ= ĠResume Runnable State . INITIAL ĊĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġrun () Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġprocessor . resume () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġstate Ġ= ĠResume Runnable State . RE SU MED ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠInterruptedException ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġstate Ġ= ĠResume Runnable State . INTERRUP TED ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠThread . currentThread (). interrupt () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġenum Ġclass ĠResume Runnable State Ġ{ ĊĠĠĠĠĠĠĠ ĠINITIAL , ĊĠĠĠĠĠĠĠ ĠINTERRUP TED , ĊĠĠĠĠĠĠĠ ĠRES U MED ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġclass ĠS uspend Runnable ( private Ġval Ġprocessor : ĠJob Processor ) Ġ: ĠRunnable Ġ{ ĊĊĠĠĠĠĠĠĠ Ġ@ Volatile ĊĠĠĠĠĠĠĠ Ġvar Ġstate Ġ= ĠS uspend Runnable State . INITIAL ĊĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġrun () Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġprocessor . suspend () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġstate Ġ= ĠS uspend Runnable State . SUS PEN DED ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠInterruptedException ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġstate Ġ= ĠS uspend Runnable State . INTERRUP TED ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠThread . currentThread (). interrupt () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġenum Ġclass ĠS uspend Runnable State Ġ{ ĊĠĠĠĠĠĠĠ ĠINITIAL , ĊĠĠĠĠĠĠĠ ĠINTERRUP TED , ĊĠĠĠĠĠĠĠ ĠS US PEN DED ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġcompanion Ġobject Ġ{ ĊĊĠĠĠĠĠĠĠ Ġinternal Ġvar Ġcount Ġ= Ġ 0 ĊĊĠĠĠĠĠĠĠ Ġinternal Ġfun Ġsleep ( ticks : ĠLong ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġend Ticks Ġ= ĠSystem . currentTimeMillis () Ġ+ Ġticks Ġ+ Ġ 4 0 ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠThread . sleep ( ticks Ġ+ Ġ 4 0 ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠInterruptedException ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwhile Ġ( System . currentTimeMillis () Ġ< Ġend Ticks ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠThread . yield () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġe . printStackTrace () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠThread . currentThread (). interrupt () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ ĠThread . yield () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ } Ċ