// ĠCopyright Ġ( c ) Ġ 2 0 2 0 - 2 0 2 1 ĠDrag on K night Of B reeze ĠWin dea Ċ // ĠB reeze Ġis Ġblow ing ... Ċ Ċ @ file : Jvm Name (" Concurrent Extensions ") Ġ@ file : Suppress (" NOTH ING _ TO _ INLINE ") Ċ Ċ package Ġic u . win dea . b reeze framework . core . extension Ċ Ċ import Ġjava . util . concurrent . Semaphore Ċ import Ġjava . util . concurrent . TimeUnit Ċ import Ġjava . util . concurrent . atomic .* Ċ import Ġjava . util . concurrent . locks . Condition Ċ Ċ // region Ġcommon Ġextensions Ċ /** Ċ Ġ* Ġ ä¼ ĳ çľ ł çº¿ç¨ĭ ãĢĤ Ċ Ġ* Ġ@ throws ĠInterruptedException Ġå¦Ĥæŀľ çº¿ç¨ĭ è¢« ä¸Ń æĸŃ ãĢĤ Ċ Ġ*/ Ċ @ Throws ( InterruptedException :: class ) Ċ fun Ġsleep ( timeout Millis : ĠLong ) Ġ{ Ċ ĉ Thread . sleep ( timeout Millis ) Ċ } Ċ Ċ /** Ċ Ġ* Ġ ä¼ ĳ çľ ł çº¿ç¨ĭ ãĢĤ Ċ Ġ* Ġ@ throws ĠInterruptedException Ġå¦Ĥæŀľ çº¿ç¨ĭ è¢« ä¸Ń æĸŃ ãĢĤ Ċ Ġ*/ Ċ @ Throws ( InterruptedException :: class ) Ċ fun Ġsleep ( timeout : ĠLong , Ġtime Unit : ĠTimeUnit ) Ġ{ Ċ ĉ time Unit . sleep ( timeout ) Ċ } Ċ Ċ /** Ċ Ġ* Ġ å°Ŀè¯ķ ä¼ ĳ çľ ł çº¿ç¨ĭ ãĢĤ å¦Ĥæŀľ çº¿ç¨ĭ è¢« ä¸Ń æĸŃ ï¼Į åĪĻ æį ķ èİ· [ InterruptedException ] ï¼Į å¹¶ éĩį ç½® ä¸Ń æĸŃ çĬ¶æĢģ ãĢĤ Ċ Ġ*/ Ċ fun Ġtry Sleep ( timeout Millis : ĠLong ) Ġ{ Ċ ĉ var Ġinterrupted Ġ= Ġfalse Ċ ĉ try Ġ{ Ċĉ ĉ sleep ( timeout Millis ) Ċ ĉ } Ġcatch Ġ( e : ĠInterruptedException ) Ġ{ Ċĉ ĉ inter rupted Ġ= Ġtrue Ċ ĉ } Ġfinally Ġ{ Ċĉ ĉ if Ġ( inter rupted ) ĠThread . currentThread (). interrupt () Ċ ĉ } Ċ } Ċ Ċ /** Ċ Ġ* Ġ å°Ŀè¯ķ ä¼ ĳ çľ ł çº¿ç¨ĭ ãĢĤ å¦Ĥæŀľ çº¿ç¨ĭ è¢« ä¸Ń æĸŃ ï¼Į åĪĻ æį ķ èİ· [ InterruptedException ] ï¼Į å¹¶ éĩį ç½® ä¸Ń æĸŃ çĬ¶æĢģ ãĢĤ Ċ Ġ*/ Ċ fun Ġtry Sleep ( timeout : ĠLong , Ġtime Unit : ĠTimeUnit ) Ġ{ Ċ ĉ var Ġinterrupted Ġ= Ġfalse Ċ ĉ try Ġ{ Ċĉ ĉ sleep ( timeout , Ġtime Unit ) Ċ ĉ } Ġcatch Ġ( e : ĠInterruptedException ) Ġ{ Ċĉ ĉ inter rupted Ġ= Ġtrue Ċ ĉ } Ġfinally Ġ{ Ċĉ ĉ if Ġ( inter rupted ) ĠThread . currentThread (). interrupt () Ċ ĉ } Ċ } Ċ Ċ // com . google . common . util . concurrent . Un interrupt ibles . sleep Un interrupt ibly Ċ Ċ /** Ċ Ġ* Ġ ä¼ ĳ çľ ł çº¿ç¨ĭ ï¼Į å¹¶ ä¿Ŀè¯ģ çº¿ç¨ĭ ä¸į è¢« ä¸Ń æĸŃ ãĢĤ Ċ Ġ*/ Ċ fun Ġforce Sleep ( timeout Millis : ĠLong ) Ġ{ Ċ ĉ var Ġinterrupted Ġ= Ġfalse Ċ ĉ try Ġ{ Ċĉ ĉ var Ġremaining Millis Ġ= Ġtimeout Millis Ċĉ ĉ val Ġend Ġ= ĠSystem . currentTimeMillis () Ġ+ Ġremaining Millis Ċĉ ĉ while Ġ( true ) Ġ{ Ċĉĉ ĉ try Ġ{ Ċĉĉĉ ĉ // TimeUnit . sleep () Ġtre ats Ġnegative Ġtimeouts Ġjust Ġlike Ġzero . Ċĉĉĉ ĉ TimeUnit . MILLISECONDS . sleep ( remaining Millis ) Ċĉĉĉ ĉ return Ċĉĉ ĉ } Ġcatch Ġ( e : ĠInterruptedException ) Ġ{ Ċĉĉĉ ĉ inter rupted Ġ= Ġtrue Ċĉĉĉ ĉ remaining Millis Ġ= Ġend Ġ- ĠSystem . currentTimeMillis () Ċĉĉ ĉ } Ċĉ ĉ } Ċ ĉ } Ġfinally Ġ{ Ċĉ ĉ if Ġ( inter rupted ) ĠThread . currentThread (). interrupt () Ċ ĉ } Ċ } Ċ Ċ /** Ċ Ġ* Ġ ä¼ ĳ çľ ł çº¿ç¨ĭ ï¼Į å¹¶ ä¿Ŀè¯ģ çº¿ç¨ĭ ä¸į è¢« ä¸Ń æĸŃ ãĢĤ Ċ Ġ*/ Ċ fun Ġforce Sleep ( timeout : ĠLong , Ġtime Unit : ĠTimeUnit ) Ġ{ Ċ ĉ var Ġinterrupted Ġ= Ġfalse Ċ ĉ try Ġ{ Ċĉ ĉ var Ġremaining Nan os Ġ= Ġtime Unit . to Nan os ( timeout ) Ċĉ ĉ val Ġend Ġ= ĠSystem . nano Time () Ġ+ Ġremaining Nan os Ċĉ ĉ while Ġ( true ) Ġ{ Ċĉĉ ĉ try Ġ{ Ċĉĉĉ ĉ // TimeUnit . sleep () Ġtre ats Ġnegative Ġtimeouts Ġjust Ġlike Ġzero . Ċĉĉĉ ĉ TimeUnit . NAN O SECONDS . sleep ( remaining Nan os ) Ċĉĉĉ ĉ return Ċĉĉ ĉ } Ġcatch Ġ( e : ĠInterruptedException ) Ġ{ Ċĉĉĉ ĉ inter rupted Ġ= Ġtrue Ċĉĉĉ ĉ remaining Nan os Ġ= Ġend Ġ- ĠSystem . nano Time () Ċĉĉ ĉ } Ċĉ ĉ } Ċ ĉ } Ġfinally Ġ{ Ċĉ ĉ if Ġ( inter rupted ) ĠThread . currentThread (). interrupt () Ċ ĉ } Ċ } Ċ Ċ /** Ċ Ġ* Ġ å¾ªçİ¯ éĩį è¯ķ ä¸Ģ æ®µ ä»£çłģ ï¼Į çĽ´ åĪ° è¿ĶåĽŀ true æĪĸèĢħ è¾¾ åĪ° æĢ» è®¡ è¶ħæĹ¶ æĹ¶éĹ´ ãĢĤ å¦Ĥæŀľ çº¿ç¨ĭ è¢« ä¸Ń æĸŃ ï¼Į åĪĻ ç»§ç»Ń éĩį è¯ķ ãĢĤ Ċ Ġ* Ġ@ return Ġ` true ` è¡¨ç¤º éĩį è¯ķ æĪĲåĬŁ ï¼Į ` false ` è¡¨ç¤º éĩį è¯ķ è¶ħæĹ¶ ãĢĤ Ċ Ġ*/ Ċ fun Ġretry Until ( interval Millis : ĠLong , Ġtimeout Millis : ĠLong , Ġaction : Ġ() Ġ-> ĠBoolean ): ĠBoolean Ġ{ Ċ ĉ val ĠstartTime Ġ= ĠSystem . currentTimeMillis () Ċ ĉ while Ġ( true ) Ġ{ Ċĉ ĉ if Ġ( action ()) Ġreturn Ġtrue Ċĉ ĉ val ĠendTime Ġ= ĠSystem . currentTimeMillis () Ċĉ ĉ if Ġ( endTime Ġ- ĠstartTime Ġ>= Ġtimeout Millis ) Ġreturn Ġfalse Ċĉ ĉ try Sleep ( interval Millis ) Ċ ĉ } Ċ } Ċ Ċ /** Ċ Ġ* Ġ å¾ªçİ¯ éĩį è¯ķ ä¸Ģ æ®µ ä»£çłģ ï¼Į çĽ´ åĪ° è¿ĶåĽŀ true æĪĸèĢħ è¾¾ åĪ° æĢ» è®¡ è¶ħæĹ¶ æĹ¶éĹ´ ãĢĤ å¦Ĥæŀľ çº¿ç¨ĭ è¢« ä¸Ń æĸŃ ï¼Į åĪĻ ç»§ç»Ń éĩį è¯ķ ãĢĤ Ċ Ġ* Ġ@ return Ġ` true ` è¡¨ç¤º éĩį è¯ķ æĪĲåĬŁ ï¼Į ` false ` è¡¨ç¤º éĩį è¯ķ è¶ħæĹ¶ ãĢĤ Ċ Ġ*/ Ċ fun Ġretry Until ( interval : ĠLong , Ġtimeout : ĠLong , Ġtime Unit : ĠTimeUnit , Ġaction : Ġ() Ġ-> ĠBoolean ): ĠBoolean Ġ{ Ċ ĉ val Ġtimeout Millis Ġ= ĠTimeUnit . MILLISECONDS . convert ( timeout , Ġtime Unit ) Ġ// æ³¨æĦı è¢« è°ĥçĶ¨ çļĦ time Unit æĺ¯ è¢« è½¬ åĮĸ ä¸º çļĦ time Unit Ċ ĉ val ĠstartTime Ġ= ĠSystem . currentTimeMillis () Ċ ĉ while Ġ( true ) Ġ{ Ċĉ ĉ if Ġ( action ()) Ġreturn Ġtrue Ċĉ ĉ val ĠendTime Ġ= ĠSystem . currentTimeMillis () Ċĉ ĉ if Ġ( endTime Ġ- ĠstartTime Ġ>= Ġtimeout Millis ) Ġreturn Ġfalse Ċĉ ĉ try Sleep ( interval , Ġtime Unit ) Ċ ĉ } Ċ } Ċ Ċ /** Ċ Ġ* Ġ å¾ªçİ¯ éĩį è¯ķ ä¸Ģ æ®µ ä»£çłģ ï¼Į çĽ´ åĪ° è¿ĶåĽŀ true æĪĸèĢħ è¾¾ åĪ° éĩį è¯ķ æ¬¡æķ° ãĢĤ å¦Ĥæŀľ çº¿ç¨ĭ è¢« ä¸Ń æĸŃ ï¼Į åĪĻ ç»§ç»Ń éĩį è¯ķ ãĢĤ Ċ Ġ* Ġ@ return Ġ` true ` è¡¨ç¤º éĩį è¯ķ æĪĲåĬŁ ï¼Į ` false ` è¡¨ç¤º éĩį è¯ķ è¶ħæĹ¶ ãĢĤ Ċ Ġ*/ Ċ fun Ġretry Until Times ( interval Millis : ĠLong , Ġtimes : ĠInt , Ġaction : Ġ() Ġ-> ĠBoolean ): ĠBoolean Ġ{ Ċ ĉ var Ġt Ġ= Ġ 1 Ċ ĉ while Ġ( true ) Ġ{ Ċĉ ĉ if Ġ( action ()) Ġreturn Ġtrue Ċĉ ĉ if Ġ( t ++ Ġ>= Ġtimes ) Ġreturn Ġfalse Ċĉ ĉ try Sleep ( interval Millis ) ĊĊ ĉ } Ċ } Ċ Ċ /** Ċ Ġ* Ġ å¾ªçİ¯ éĩį è¯ķ ä¸Ģ æ®µ ä»£çłģ ï¼Į çĽ´ åĪ° è¿ĶåĽŀ true æĪĸèĢħ è¾¾ åĪ° éĩį è¯ķ æ¬¡æķ° ãĢĤ å¦Ĥæŀľ çº¿ç¨ĭ è¢« ä¸Ń æĸŃ ï¼Į åĪĻ ç»§ç»Ń éĩį è¯ķ ãĢĤ Ċ Ġ* Ġ@ return Ġ` true ` è¡¨ç¤º éĩį è¯ķ æĪĲåĬŁ ï¼Į ` false ` è¡¨ç¤º éĩį è¯ķ è¶ħæĹ¶ ãĢĤ Ċ Ġ*/ Ċ fun Ġretry Until Times ( interval : ĠLong , Ġtime Unit : ĠTimeUnit , Ġtimes : ĠInt , Ġaction : Ġ() Ġ-> ĠBoolean ): ĠBoolean Ġ{ Ċ ĉ var Ġt Ġ= Ġ 1 Ċ ĉ while Ġ( true ) Ġ{ Ċĉ ĉ if Ġ( action ()) Ġreturn Ġtrue Ċĉ ĉ if Ġ( t ++ Ġ>= Ġtimes ) Ġreturn Ġfalse Ċĉ ĉ try Sleep ( interval , Ġtime Unit ) Ċ ĉ } Ċ } Ċ Ċ @ Jvm Synt hetic Ċ inline Ġfun Ġ< T > ĠCondition . with Await ( signal All : ĠBoolean Ġ= Ġtrue , Ġaction : Ġ() Ġ-> ĠT ): ĠT Ġ{ Ċ ĉ this . await () Ċ ĉ try Ġ{ Ċĉ ĉ return Ġaction () Ċ ĉ } Ġfinally Ġ{ Ċĉ ĉ if Ġ( signal All ) Ġsignal All () Ġelse Ġsignal () Ċ ĉ } Ċ } Ċ Ċ @ Jvm Synt hetic Ċ inline Ġfun Ġ< T > ĠSem aphore . with Acquire ( permit s : ĠInt Ġ= Ġ 1 , Ġaction : Ġ() Ġ-> ĠT ): ĠT Ġ{ Ċ ĉ this . acquire ( permit s ) Ċ ĉ try Ġ{ Ċĉ ĉ return Ġaction () Ċ ĉ } Ġfinally Ġ{ Ċĉ ĉ release ( permit s ) Ċ ĉ } Ċ } Ċ // endregion Ċ Ċ // region Ġconvert Ġextensions Ċ /** Ċ Ġ* å°Ĩ å½ĵåīį å¸ĥ å°Ķ åĢ¼ è½¬ åĮĸ ä¸º åİŁ åŃĲ ç±»åŀĭ ãĢĤ Ċ Ġ*/ Ċ fun ĠBoolean . as Atomic () Ġ= ĠAtomic Boolean ( this ) Ċ Ċ /** Ċ Ġ* Ġå°Ĩ å½ĵåīį æķ´æķ° è½¬ åĮĸ ä¸º åİŁ åŃĲ ç±»åŀĭ ãĢĤ Ċ Ġ*/ Ċ fun ĠInt . as Atomic () Ġ= ĠAtomicInteger ( this ) Ċ Ċ /** Ċ Ġ* Ġå°Ĩ å½ĵåīį éķ¿ æķ´æķ° è½¬ åĮĸ ä¸º åİŁ åŃĲ ç±»åŀĭ ãĢĤ Ċ Ġ*/ Ċ fun ĠLong . as Atomic () Ġ= ĠAtomic Long ( this ) Ċ Ċ /** Ċ Ġ* Ġå°Ĩ å½ĵåīį æķ´æķ° æķ°ç»Ħ è½¬ åĮĸ ä¸º åİŁ åŃĲ ç±»åŀĭ ãĢĤ Ċ Ġ*/ Ċ fun ĠInt Array . as Atomic () Ġ= ĠAtomicInteger Array ( this ) Ċ Ċ /** Ċ Ġ* Ġå°Ĩ å½ĵåīį éķ¿ æķ´æķ° æķ°ç»Ħ è½¬ åĮĸ ä¸º åİŁ åŃĲ ç±»åŀĭ ãĢĤ Ċ Ġ*/ Ċ fun ĠLong Array . as Atomic () Ġ= ĠAtomic Long Array ( this ) Ċ Ċ /** Ċ Ġ* Ġå°Ĩ å½ĵåīį å¼ķçĶ¨ è½¬ åĮĸ ä¸º åİŁ åŃĲ å¼ķçĶ¨ ãĢĤ Ċ Ġ*/ Ċ fun Ġ< T > ĠT . as Atomic Reference () Ġ= ĠAtomic Reference ( this ) Ċ Ċ /** Ċ Ġ* Ġå°Ĩ å½ĵåīį å¼ķçĶ¨ æķ°ç»Ħ è½¬ åĮĸ ä¸º åİŁ åŃĲ å¼ķçĶ¨ æķ°ç»Ħ ãĢĤ Ċ Ġ*/ Ċ fun Ġ< T > ĠArray < out ĠT >. as Atomic Reference Array () Ġ= ĠAtomic Reference Array ( this ) Ċ // endregion Ċ