рдирдорд╕реНрддреЗ! рдЗрд╕ рд╕рдкреНрддрд╛рд╣ рдХрд╛рд░реНрдп рдмрд╛рд╣рд░реА рд╕рд┐рд╕реНрдЯрдо рдХреЗ рд╕рд╛рде рдЕрддреБрд▓реНрдпрдХрд╛рд▓рд┐рдХ рдмрд╛рддрдЪреАрдд рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рд╕реНрдкреНрд░рд┐рдВрдЧ рдмреВрдЯ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдХреЗ рд▓рд┐рдП рдПрдХ рдПрдХреАрдХрд░рдг рдкрд░реАрдХреНрд╖рдг рд▓рд┐рдЦрдирд╛ рдерд╛ред рдмрд╣реБрдЖрдпрд╛рдореА рдХреЛрдб рдбрд┐рдмрдЧрд┐рдВрдЧ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдмрд╣реБрдд рд╕рд╛рд░реА рд╕рд╛рдордЧреНрд░реА рдХреЛ рддрд╛рдЬрд╝рд╛ рдХрд┐рдпрд╛ред рдЬреЛрдирд╛рдерди рд╣реИрд▓реНрдЯрд░рдореИрди рдХреЗ рд▓реЗрдЦ "рдорд▓реНрдЯреА-рдереНрд░реЗрдбреЗрдб рдПрдВрдб рдПрд╕рд┐рдВрдХреНрд░реЛрдирд╕ рдХреЛрдб рдХрд╛ рдкрд░реАрдХреНрд╖рдг", рдЬрд┐рд╕рдХрд╛
рдЕрдиреБрд╡рд╛рдж рдиреАрдЪреЗ рджрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ, рдиреЗ рдзреНрдпрд╛рди рдЖрдХрд░реНрд╖рд┐рдд рдХрд┐рдпрд╛ред
рдореВрд▓ рд▓реЗрдЦ рд╕реЗ рд╕рдмрд╕реЗ рдорд╣рддреНрд╡рдкреВрд░реНрдг рдХреЛрдб рдЯрд┐рдкреНрдкрдгрд┐рдпреЛрдВ рдХреЗ рд▓рд┐рдП
shalomman ,
schroeder рдФрд░
FTOH рдХрд╛ рдзрдиреНрдпрд╡рд╛рджред
рдпрджрд┐ рдЖрдк рдХреЛрдб рдХреЛ рд▓рдВрдмреЗ рд╕рдордп рддрдХ рд▓рд┐рдЦрддреЗ рд╣реИрдВ рдпрд╛ рд╢рд╛рдпрдж рдирд╣реАрдВ, рддреЛ рдЖрдк рд╕рдВрднрд╡рддрдГ рдПрдХ рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдХреЗ рдкрд╛рд░ рдЖрдП рдЬрд┐рд╕рдореЗрдВ рдЖрдкрдХреЛ рдмрд╣реБ-рдереНрд░реЗрдбреЗрдб рдХреЛрдб рдХрд╛ рдкрд░реАрдХреНрд╖рдг рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред рдЖрдорддреМрд░ рдкрд░ рдпрд╣ рдорд╛рдирд╛ рдЬрд╛рддрд╛ рд╣реИ рдХрд┐ рдзрд╛рдЧреЗ рдФрд░ рдкрд░реАрдХреНрд╖рдгреЛрдВ рдХреЛ рдорд┐рд╢реНрд░рд┐рдд рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдПред рдРрд╕рд╛ рдЖрдорддреМрд░ рдкрд░ рд╣реЛрддрд╛ рд╣реИ рдХреНрдпрд╛ рдкрд░реАрдХреНрд╖рдг рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рд╣реИ рдмрд╕ рдПрдХ рдмрд╣реБ-рдереНрд░реЗрдбреЗрдб рд╕рд┐рд╕реНрдЯрдо рдХреЗ рдЕрдВрджрд░ рд╢реБрд░реВ рд╣реЛрддрд╛ рд╣реИ рдФрд░ рдзрд╛рдЧреЗ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдП рдмрд┐рдирд╛ рд╡реНрдпрдХреНрддрд┐рдЧрдд рд░реВрдк рд╕реЗ рдкрд░реАрдХреНрд╖рдг рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рд▓реЗрдХрд┐рди рдХреНрдпрд╛ рд╣реЛрдЧрд╛ рдЕрдЧрд░ рдЖрдк рдЙрдиреНрд╣реЗрдВ рдЕрд▓рдЧ рдирд╣реАрдВ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рдпрд╛ рдЕрдзрд┐рдХ, рдпрджрд┐ рдорд▓реНрдЯреАрдереНрд░реЗрдбрд┐рдВрдЧ рдЙрд╕ рдкрд╣рд▓реВ рдХрд╛ рдХреЛрдб рд╣реИ рдЬрд┐рд╕реЗ рдЖрдк рдкрд░реАрдХреНрд╖рдг рдХрд░ рд░рд╣реЗ рд╣реИрдВ?
рдореИрдВ рдпрд╣рд╛рдВ рдЖрдкрдХреЛ рдпрд╣ рдмрддрд╛рдиреЗ рдХреЗ рд▓рд┐рдП рд╣реВрдВ рдХрд┐ рдпрджреНрдпрдкрд┐ рдкрд░реАрдХреНрд╖рдгреЛрдВ рдореЗрдВ рдзрд╛рдЧреЗ рдмрд╣реБрдд рдЖрдо рдирд╣реАрдВ рд╣реИрдВ, рд╡реЗ рдХрд╛рдлреА рдЙрдкрдпреЛрдЧ рдХрд┐рдП рдЬрд╛рддреЗ рд╣реИрдВред рдПрдХ рдЗрдХрд╛рдИ рдкрд░реАрдХреНрд╖рдг рдореЗрдВ рдереНрд░реЗрдб рд╢реБрд░реВ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╕реЙрдлреНрдЯрд╡реЗрдпрд░ рдкреБрд▓рд┐рд╕ рдЖрдкрдХреЛ рдЧрд┐рд░рдлреНрддрд╛рд░ рдирд╣реАрдВ рдХрд░реЗрдЧреА, рд╣рд╛рд▓рд╛рдВрдХрд┐ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдмрд╣реБ-рдереНрд░реЗрдбреЗрдб рдХреЛрдб рдХрд╛ рдкрд░реАрдХреНрд╖рдг рдХреИрд╕реЗ рдХрд░реЗрдВ рдпрд╣ рдПрдХ рдФрд░ рдорд╛рдорд▓рд╛ рд╣реИред рдХреБрдЫ рдЙрддреНрдХреГрд╖реНрдЯ рдЕрддреБрд▓реНрдпрдХрд╛рд▓рд┐рдХ рдкреНрд░реМрджреНрдпреЛрдЧрд┐рдХрд┐рдпрд╛рдВ, рдЬреИрд╕реЗ рдЕрдХреНрдХрд╛ рдФрд░ рд╡рд░реНрдЯ.рдПрдХреНрд╕, рдЗрд╕ рдмреЛрдЭ рдХреЛ рдХрдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП
рдкрд░реАрдХреНрд╖рдг рдХрд┐рдЯ рдкреНрд░рджрд╛рди рдХрд░рддреА рд╣реИрдВред рд▓реЗрдХрд┐рди рдЗрд╕рд╕реЗ рдкрд░реЗ, рдмрд╣реБ-рдереНрд░реЗрдбреЗрдб рдХреЛрдб рдХрд╛ рдкрд░реАрдХреНрд╖рдг рдЖрдорддреМрд░ рдкрд░ рдПрдХ рд╡рд┐рд╢рд┐рд╖реНрдЯ рддреБрд▓реНрдпрдХрд╛рд▓рд┐рдХ рдЗрдХрд╛рдИ рдкрд░реАрдХреНрд╖рдг рдХреА рддреБрд▓рдирд╛ рдореЗрдВ рдПрдХ рдЕрд▓рдЧ рджреГрд╖реНрдЯрд┐рдХреЛрдг рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИред
рд╣рдо рд╕рдорд╛рдирд╛рдВрддрд░ рдЪрд▓рддреЗ рд╣реИрдВ
рдкрд╣рд▓рд╛ рдХрджрдо рдХрд┐рд╕реА рднреА рдорд▓реНрдЯреАрдереНрд░реЗрдбреЗрдб рдПрдХреНрд╢рди рдХреЛ рд▓реЙрдиреНрдЪ рдХрд░рдирд╛ рд╣реИ рдЬрд┐рд╕рдХреЗ рд▓рд┐рдП рдЖрдк рдкрд░рд┐рдгрд╛рдо рдХреА рдЬрд╛рдВрдЪ рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдЪрд▓реЛ рдПрдХ рд╕рдВрджреЗрд╢ рдмрд╕ рдкрд░ рдПрдХ рд╕рдВрджреЗрд╢ рд╣реИрдВрдбрд▓рд░ рдХреЛ рдкрдВрдЬреАрдХреГрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдХрд╛рд▓реНрдкрдирд┐рдХ рдПрдкреАрдЖрдИ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВ рдФрд░ рдмрд╕ рдкрд░ рдПрдХ рд╕рдВрджреЗрд╢ рдкреНрд░рдХрд╛рд╢рд┐рдд рдХрд░реЗрдВ, рдЬрд┐рд╕реЗ рд╣рдорд╛рд░реЗ рд╣реИрдВрдбрд▓рд░ рдХреЛ рдПрдХ рдЕрд▓рдЧ рдзрд╛рдЧреЗ рдореЗрдВ рдЕрддреБрд▓реНрдпрдХрд╛рд▓рд┐рдХ рд░реВрдк рд╕реЗ рд╡рд┐рддрд░рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛:
messageBus.registerHandler(message - > { System.out.println("Received " + message); }); messageBus.publish("test");
рдпрд╣ рдЕрдЪреНрдЫрд╛ рд▓рдЧ рд░рд╣рд╛ рд╣реИред рдЬрдм рдкрд░реАрдХреНрд╖рдг рд╢реБрд░реВ рд╣реЛрддрд╛ рд╣реИ, рддреЛ рдмрд╕ рдХреЛ рд╣рдорд╛рд░реЗ рд╕рдВрджреЗрд╢ рдХреЛ рджреВрд╕рд░реЗ рдзрд╛рдЧреЗ рдореЗрдВ рд╣реИрдВрдбрд▓рд░ рдХреЛ рднреЗрдЬрдирд╛ рдЪрд╛рд╣рд┐рдП, рд▓реЗрдХрд┐рди рдпрд╣ рдмрд╣реБрдд рдЙрдкрдпреЛрдЧреА рдирд╣реАрдВ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рд╣рдо рдХреБрдЫ рднреА рдирд╣реАрдВ рдЬрд╛рдВрдЪрддреЗ рд╣реИрдВред рдЖрдЗрдП рдкреБрд╖реНрдЯрд┐ рдХреЗ рд▓рд┐рдП рд╣рдорд╛рд░реЗ рдкрд░реАрдХреНрд╖рдг рдХреЛ рдЕрдкрдбреЗрдЯ рдХрд░реЗрдВ рдХрд┐ рд╕рдВрджреЗрд╢ рдмрд╕ рдЕрдкреЗрдХреНрд╖рд╛ рдХреЗ рдЕрдиреБрд╕рд╛рд░ рд╣рдорд╛рд░реЗ рд╕рдВрджреЗрд╢ рдХреЛ рд╡рд┐рддрд░рд┐рдд рдХрд░рддрд╛ рд╣реИ:
String msg = "test"; messageBus.registerHandler(message -> { System.out.println("Received " + message); assertEquals(message, msg); }; messageBus.publish(msg);
рдпрд╣ рдмреЗрд╣рддрд░ рд▓рдЧ рд░рд╣рд╛ рд╣реИред рд╣рдо рдЕрдкрдирд╛ рдкрд░реАрдХреНрд╖рдг рдЪрд▓рд╛рддреЗ рд╣реИрдВ рдФрд░ рдпрд╣ рд╣рд░рд╛ рд╣реИред рдХреВрд▓! рд▓реЗрдХрд┐рди рдкреНрд░рд╛рдкреНрдд рд╕рдВрджреЗрд╢ рдХрд╣реАрдВ рднреА рдореБрджреНрд░рд┐рдд рдирд╣реАрдВ рдерд╛, рдХрд╣реАрдВ рди рдХрд╣реАрдВ рдХреБрдЫ рдЧрд▓рдд рдерд╛ред
рдПрдХ рд╕реЗрдХрдВрдб рд░реБрдХрд┐рдП
рдЙрдкрд░реЛрдХреНрдд рдкрд░реАрдХреНрд╖рдг рдореЗрдВ, рдЬрдм рд╕рдВрджреЗрд╢ рдмрд╕ рдкрд░ рд╕рдВрджреЗрд╢ рдкреНрд░рдХрд╛рд╢рд┐рдд рд╣реЛрддрд╛ рд╣реИ, рддреЛ рдЗрд╕реЗ рдмрд╕ рджреНрд╡рд╛рд░рд╛ рджреВрд╕рд░реЗ рдереНрд░реЗрдб рдореЗрдВ рд╣реИрдВрдбрд▓рд░ рдХреЛ рджрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рд▓реЗрдХрд┐рди рдЬрдм рдПрдХ рдпреВрдирд┐рдЯ рдЯреЗрд╕реНрдЯрд┐рдВрдЧ рдЯреВрд▓ рдЬреИрд╕реЗ JUnit рдПрдХ рдкрд░реАрдХреНрд╖рдг рдЪрд▓рд╛рддрд╛ рд╣реИ, рддреЛ рдпрд╣ рд╕рдВрджреЗрд╢ рдмрд╕ рдкреНрд░рд╡рд╛рд╣ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдХреБрдЫ рдирд╣реАрдВ рдЬрд╛рдирддрд╛ рд╣реИред JUnit рдХреЗрд╡рд▓ рдореБрдЦреНрдп рдзрд╛рдЧреЗ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЬрд╛рдирддрд╛ рд╣реИ рдЬрд┐рд╕рдореЗрдВ рдпрд╣ рдкрд░реАрдХреНрд╖рдг рдЪрд▓рд╛рддрд╛ рд╣реИред рдЗрд╕ рдкреНрд░рдХрд╛рд░, рдЬрдмрдХрд┐ рд╕рдВрджреЗрд╢ рдмрд╕ рд╕рдВрджреЗрд╢ рджреЗрдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдореЗрдВ рд╡реНрдпрд╕реНрдд рд╣реИ, рдкрд░реАрдХреНрд╖рдг рдореБрдЦреНрдп рдкрд░реАрдХреНрд╖рдг рдереНрд░реЗрдб рдореЗрдВ рдирд┐рд╖реНрдкрд╛рджрди рдХреЛ рдкреВрд░рд╛ рдХрд░рддрд╛ рд╣реИ рдФрд░ JUnit рд╕рдлрд▓рддрд╛ рдХреА рд░рд┐рдкреЛрд░реНрдЯ рдХрд░рддрд╛ рд╣реИред рдЗрд╕реЗ рдХреИрд╕реЗ рд╣рд▓ рдХрд░реЗрдВ? рд╣рдореЗрдВ рдЕрдкрдирд╛ рд╕рдВрджреЗрд╢ рджреЗрдиреЗ рдХреЗ рд▓рд┐рдП рд╕рдВрджреЗрд╢ рдмрд╕ рдХреА рдкреНрд░рддреАрдХреНрд╖рд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдореБрдЦреНрдп рдкрд░реАрдХреНрд╖рдг рд╕реВрддреНрд░ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред рддреЛ рдЪрд▓реЛ рдПрдХ рдиреАрдВрдж рдмрдпрд╛рди рдЬреЛрдбрд╝реЗрдВ:
String msg = "test"; messageBus.registerHandler(message -> { System.out.println("Received " + message); assertEquals(message, msg); }; messageBus.publish(msg); Thread.sleep(1000);
рд╣рдорд╛рд░рд╛ рдкрд░реАрдХреНрд╖рдг рд╣рд░рд╛ рд╣реИ рдФрд░ рдкреНрд░рд╛рдкреНрдд рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐ рдЕрдкреЗрдХреНрд╖рд┐рдд рд░реВрдк рд╕реЗ рдореБрджреНрд░рд┐рдд рд╣реИред рдХреВрд▓! рд▓реЗрдХрд┐рди рдиреАрдВрдж рдХреЗ рдПрдХ рд╕реЗрдХрдВрдб рдХрд╛ рдорддрд▓рдм рд╣реИ рдХрд┐ рд╣рдорд╛рд░рд╛ рдкрд░реАрдХреНрд╖рдг рдХрдо рд╕реЗ рдХрдо рдПрдХ рд╕реЗрдХрдВрдб рдХреЗ рд▓рд┐рдП рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдФрд░ рдЗрд╕рдореЗрдВ рдХреБрдЫ рднреА рдЕрдЪреНрдЫрд╛ рдирд╣реАрдВ рд╣реИред рд╣рдо рд╕реЛрдиреЗ рдХрд╛ рд╕рдордп рдХрдо рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди рдлрд┐рд░ рд╣рдо рд╕рдВрджреЗрд╢ рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рд╕реЗ рдкрд╣рд▓реЗ рдкрд░реАрдХреНрд╖рдг рдкреВрд░рд╛ рдХрд░рдиреЗ рдХрд╛ рдЬреЛрдЦрд┐рдо рдЙрдард╛рддреЗ рд╣реИрдВред рд╣рдореЗрдВ рдореБрдЦреНрдп рдкрд░реАрдХреНрд╖рдг рдереНрд░реЗрдб рдФрд░ рд╕рдВрджреЗрд╢ рд╣реИрдВрдбрд▓рд░ рдереНрд░реЗрдб рдХреЗ рдмреАрдЪ рд╕рдордиреНрд╡рдп рдХрд░рдиреЗ рдХрд╛ рдПрдХ рддрд░реАрдХрд╛ рдЪрд╛рд╣рд┐рдПред
Java.util.concurrent рдкреИрдХреЗрдЬ рдХреЛ рджреЗрдЦрддреЗ рд╣реБрдП, рд╣рдо рдирд┐рд╢реНрдЪрд┐рдд рд╣реИрдВ рдХрд┐ рд╣рдо рдХреНрдпрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред
CountDownLatch рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдХреНрдпрд╛?
String msg = "test"; CountDownLatch latch = new CountDownLatch(1); messageBus.registerHandler(message -> { System.out.println("Received " + message); assertEquals(message, msg); latch.countDown(); }; messageBus.publish(msg); latch.await();
рдЗрд╕ рджреГрд╖реНрдЯрд┐рдХреЛрдг рдореЗрдВ, рд╣рдо рдореБрдЦреНрдп рдкрд░реАрдХреНрд╖рдг рдереНрд░реЗрдб рдФрд░ рд╕рдВрджреЗрд╢ рд╣реИрдВрдбрд▓рд░ рдереНрд░реЗрдб рдХреЗ рдмреАрдЪ CountDownLatch рд╕рд╛рдЭрд╛ рдХрд░рддреЗ рд╣реИрдВред рдореБрдЦреНрдп рдзрд╛рдЧрд╛ рдЕрд╡рд░реЛрдзрдХ рдкрд░ рдкреНрд░рддреАрдХреНрд╖рд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдордЬрдмреВрд░ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдкрд░реАрдХреНрд╖рдг рдереНрд░реЗрдб рд╕рдВрджреЗрд╢ рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреЗ рдмрд╛рдж рдмреНрд▓реЙрдХрд░ рдкрд░ рдХрд╛рдЙрдВрдЯрдбрд╛рдЙрди () рдХреЙрд▓ рдХрд░рдХреЗ рд▓рдВрдмрд┐рдд рдореБрдЦреНрдп рдзрд╛рдЧреЗ рдХреЛ рдЬрд╛рд░реА рдХрд░рддрд╛ рд╣реИред рд╣рдореЗрдВ рдЕрдм рдПрдХ рд╕реЗрдХрдВрдб рдХреЗ рд▓рд┐рдП рд╕реЛрдиреЗ рдХреА рдЬрд░реВрд░рдд рдирд╣реАрдВ рд╣реИред рд╣рдорд╛рд░реЗ рдкрд░реАрдХреНрд╖рдг рдореЗрдВ рдЖрд╡рд╢реНрдпрдХрддрд╛рдиреБрд╕рд╛рд░ рдЕрдзрд┐рдХ рд╕рдордп рд▓рдЧрддрд╛ рд╣реИред
рдЗрддрдирд╛ рдЦреБрд╢?
рд╣рдорд╛рд░реЗ рдирдП рдЖрдХрд░реНрд╖рдг, рдХрд╛рдЙрдВрдЯрдбрд╛рдЙрдирдЪреИрдЪ рдХреЗ рд╕рд╛рде, рд╣рдо рдирд╡реАрдирддрдо рдлрд╝реИрд╢рдирд┐рд╕реНрдЯреЛрдВ рдХреА рддрд░рд╣ рдмрд╣реБ-рдереНрд░реЗрдбреЗрдб рдкрд░реАрдХреНрд╖рдг рд▓рд┐рдЦрдирд╛ рд╢реБрд░реВ рдХрд░рддреЗ рд╣реИрдВред рд▓реЗрдХрд┐рди рдмрд╣реБрдд рдЬрд▓реНрджреА, рд╣рдо рджреЗрдЦрддреЗ рд╣реИрдВ рдХрд┐ рд╣рдорд╛рд░рд╛ рдПрдХ рдкрд░реАрдХреНрд╖рдг рдорд╛рдорд▓рд╛ рд╣рдореЗрд╢рд╛ рдХреЗ рд▓рд┐рдП рдЕрд╡рд░реБрджреНрдз рд╣реЛ рдЬрд╛рддрд╛ рд╣реИ рдФрд░ рд╕рдорд╛рдкреНрдд рдирд╣реАрдВ рд╣реЛрддрд╛ рд╣реИред рдХреНрдпрд╛ рдЪрд▓ рд░рд╣рд╛ рд╣реИ? рд╕рдВрджреЗрд╢ рдмрд╕ рдкрд░рд┐рджреГрд╢реНрдп рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░реЗрдВ: рдЕрд╡рд░реЛрдзрдХ рдЖрдкрдХреЛ рдкреНрд░рддреАрдХреНрд╖рд╛ рдХрд░рддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдпрд╣ рд╕рдВрджреЗрд╢ рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреЗ рдмрд╛рдж рд╣реА рдЬрд╛рд░реА рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдпрджрд┐ рдмрд╕ рдХрд╛рдо рдирд╣реАрдВ рдХрд░рддреА рд╣реИ рдФрд░ рд╕рдВрджреЗрд╢ рдХрднреА рдирд╣реАрдВ рджрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рддреЛ рдкрд░реАрдХреНрд╖рдг рдХрднреА рд╕рдорд╛рдкреНрдд рдирд╣реАрдВ рд╣реЛрдЧрд╛ред рддреЛ рдЪрд▓реЛ рдЕрд╡рд░реЛрдзрдХ рдХреЗ рд▓рд┐рдП рдПрдХ рд╕рдордп рд╕реАрдорд╛ рдЬреЛрдбрд╝реЗрдВ:
latch.await(1, TimeUnit.SECONDS);
рдПрдХ рдкрд░реАрдХреНрд╖рдг рдЬреЛ рдмреНрд▓реЙрдХ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ рд╡рд╣ TimeoutException рдЕрдкрд╡рд╛рдж рдХреЗ рд╕рд╛рде 1 рд╕реЗрдХрдВрдб рдХреЗ рдмрд╛рдж рд╡рд┐рдлрд▓ рд╣реЛ рдЬрд╛рддрд╛ рд╣реИред рдЕрдВрдд рдореЗрдВ, рд╣рдо рд╕рдорд╕реНрдпрд╛ рдХреЛ рдвреВрдВрдвреЗрдВрдЧреЗ рдФрд░ рдкрд░реАрдХреНрд╖рдг рдХреЛ рдареАрдХ рдХрд░реЗрдВрдЧреЗ, рд▓реЗрдХрд┐рди рд╕рдордп-рд╕рдордп рдкрд░ рдЬрдЧрд╣ рдЫреЛрдбрд╝рдиреЗ рдХрд╛ рдирд┐рд░реНрдгрдп рд▓реЗрдВрдЧреЗред рдпрджрд┐ рдпрд╣ рдлрд┐рд░ рд╕реЗ рд╣реЛрддрд╛ рд╣реИ, рддреЛ рд╣рдо рдЕрдкрдиреЗ рдкрд░реАрдХреНрд╖рдг рдХреЛ рдПрдХ рджреВрд╕рд░реЗ рдФрд░ рдХреНрд░реИрд╢ рдХреЗ рд▓рд┐рдП рд▓реЙрдХ рдХрд░рдирд╛ рдкрд╕рдВрдж рдХрд░реЗрдВрдЧреЗ, рд╣рдореЗрд╢рд╛ рдХреЗ рд▓рд┐рдП рдмреНрд▓реЙрдХ рдХрд░рдиреЗ рдФрд░ рдмрд┐рд▓реНрдХреБрд▓ рднреА рдкреВрд░рд╛ рдирд╣реАрдВ рд╣реЛрдиреЗ рдХреЗ рд▓рд┐рдПред
рдкрд░реАрдХреНрд╖рдг рд▓рд┐рдЦрддреЗ рд╕рдордп рдПрдХ рдФрд░ рд╕рдорд╕реНрдпрд╛ рд╣рдореЗрдВ рджрд┐рдЦрд╛рдИ рджреЗрддреА рд╣реИ рдХрд┐ рд╡реЗ рд╕рднреА рддрдм рднреА рдкрд╛рд╕ рд╣реЛрдиреЗ рд▓рдЧрддреА рд╣реИрдВ рдЬрдм рдЙрдиреНрд╣реЗрдВ рд╢рд╛рдпрдж рдирд╣реАрдВ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдПред рдпрд╣ рдХреИрд╕реЗ рд╕рдВрднрд╡ рд╣реИ? рд╕рдВрджреЗрд╢ рдкреНрд░рд╕рдВрд╕реНрдХрд░рдг рдкрд░реАрдХреНрд╖рдг рдкрд░ рдлрд┐рд░ рд╕реЗ рд╡рд┐рдЪрд╛рд░ рдХрд░реЗрдВ:
messageBus.registerHandler(message -> { assertEquals(message, msg); latch.countDown(); };
рд╣рдореЗрдВ рдореБрдЦреНрдп рдкрд░реАрдХреНрд╖рдг рдереНрд░реЗрдб рдХреЗ рд╕рд╛рде рдЕрдкрдиреЗ рдкрд░реАрдХреНрд╖рдг рдХреЗ рдкреВрд░рд╛ рд╣реЛрдиреЗ рдХреЗ рд╕рдордиреНрд╡рдп рдХреЗ рд▓рд┐рдП CountDownLatch рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП рдерд╛, рд▓реЗрдХрд┐рди рдХреНрдпрд╛ рд╣реИ? рдпрджрд┐ рд╕рддреНрдпрд╛рдкрди рд╡рд┐рдлрд▓ рд╣реЛ рдЬрд╛рддрд╛ рд╣реИ, рддреЛ рдХреНрдпрд╛ JUnit рдХреЛ рдЗрд╕рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдкрддрд╛ рд╣реЛрдЧрд╛? рдпрд╣ рдкрддрд╛ рдЪрд▓рд╛ рд╣реИ рдХрд┐ рдЪреВрдВрдХрд┐ рд╣рдо рдореБрдЦреНрдп рдкрд░реАрдХреНрд╖рдг рдереНрд░реЗрдб рдореЗрдВ рд╕рддреНрдпрд╛рдкрди рдирд╣реАрдВ рдХрд░рддреЗ рд╣реИрдВ, рдЗрд╕рд▓рд┐рдП рдХрд┐рд╕реА рднреА рддреНрд░реБрдЯрд┐рдкреВрд░реНрдг рдЬрд╛рдВрдЪ рдХреЛ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдзреНрдпрд╛рди рдирд╣реАрдВ рджрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдЖрдЗрдП рдЗрд╕реЗ рдкрд░рдЦрдиреЗ рдХреЗ рд▓рд┐рдП рдереЛрдбрд╝реА рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░реЗрдВ:
CountDownLatch latch = new CountDownLatch(1); new Thread(() -> { assertTrue(false); latch.countDown(); }).start(); latch.await();
рдкрд░реАрдХреНрд╖рдг рд╣рд░рд╛ рд╣реИ! рддреЛ рдЕрдм рд╣рдо рдХреНрдпрд╛ рдХрд░реЗрдВ? рд╣рдореЗрдВ рд╕рдВрджреЗрд╢ рд╣реИрдВрдбрд▓рд░ рд╕реНрдЯреНрд░реАрдо рд╕реЗ рдХрд┐рд╕реА рднреА рдкрд░реАрдХреНрд╖рдг рддреНрд░реБрдЯрд┐рдпреЛрдВ рдХреЛ рдореБрдЦреНрдп рдкрд░реАрдХреНрд╖рдг рд╕реНрдЯреНрд░реАрдо рдореЗрдВ рднреЗрдЬрдиреЗ рдХрд╛ рдПрдХ рддрд░реАрдХрд╛ рдЪрд╛рд╣рд┐рдПред рдпрджрд┐ рд╕рдВрджреЗрд╢ рд╣реИрдВрдбрд▓рд░ рдереНрд░реЗрдб рдореЗрдВ рдХреЛрдИ рд╡рд┐рдлрд▓рддрд╛ рд╣реЛрддреА рд╣реИ, рддреЛ рд╣рдореЗрдВ рдореБрдЦреНрдп рдереНрд░реЗрдб рдореЗрдВ рдкреБрди: рдкреНрд░рдХрдЯ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИ рддрд╛рдХрд┐ рдкрд░реАрдХреНрд╖рдг рдлрд╝реНрд▓рд┐рдк рд╣реЛ рдЬрд╛рдП, рдЬреИрд╕рд╛ рдХрд┐ рдЕрдкреЗрдХреНрд╖рд┐рдд рдерд╛ред рдЖрдЗрдП рдЗрд╕реЗ рдХрд░рдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд░реЗрдВ:
CountDownLatch latch = new CountDownLatch(1); AtomicReference<AssertionError> failure = new AtomicReference<>(); new Thread(() -> { try { assertTrue(false); } catch (AssertionError e) { failure.set(e); } latch.countDown(); }).start(); latch.await(); if (failure.get() != null) throw failure.get();
рддреНрд╡рд░рд┐рдд рд╢реБрд░реБрдЖрдд рдФрд░ рд╣рд╛рдБ, рдкрд░реАрдХреНрд╖рдг рд╡рд┐рдлрд▓ рд░рд╣рддрд╛ рд╣реИ, рдЬреИрд╕рд╛ рдХрд┐ рдпрд╣ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП! рдЕрдм рд╣рдо рд╡рд╛рдкрд╕ рдЬрд╛ рд╕рдХрддреЗ рд╣реИрдВ рдФрд░ рд╣рдорд╛рд░реЗ рд╕рднреА рдкрд░реАрдХреНрд╖рдг рдорд╛рдорд▓реЛрдВ рдореЗрдВ рдХрд╛рдЙрдВрдЯрдбрд╛рдЙрдирдЪреИрдЯреНрд╕, рдЯреНрд░рд╛рдЗ / рдХреИрдЪ рдФрд░ рдПрдЯреЙрдорд┐рдХ рд░рд┐рдлрд░реЗрдВрд╕ рдмреНрд▓реЙрдХ рдЬреЛрдбрд╝ рд╕рдХрддреЗ рд╣реИрдВред рдХреВрд▓! рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ, рд╢рд╛рдВрдд рдирд╣реАрдВ, рдпрд╣ рдПрдХ рдмреЙрдпрд▓рд░рдкреНрд▓реЗрдЯ рдЬреИрд╕рд╛ рджрд┐рдЦрддрд╛ рд╣реИред
рдХрдЪрд░рд╛ рдХрд╛рдЯреЛ
рдЖрджрд░реНрд╢ рд░реВрдк рд╕реЗ, рд╣рдореЗрдВ рдПрдХ рдПрдкреАрдЖрдИ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИ рдЬреЛ рд╣рдореЗрдВ рдереНрд░реЗрдбреНрд╕ рдХреЗ рдмреАрдЪ рд╡реЗрдЯрд┐рдВрдЧ, рдЪреЗрдХрд┐рдВрдЧ рдФрд░ рд░рд┐рдЬреНрдпреВрдорд┐рдВрдЧ рдХреЛрдСрд░реНрдбрд┐рдиреЗрдЯ рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИ, рддрд╛рдХрд┐ рдпреВрдирд┐рдЯ рдЯреЗрд╕реНрдЯ рдкрд╛рд╕ рд╣реЛ рд╕рдХреЗрдВ рдпрд╛ рдЙрдореНрдореАрдж рдХреЗ рдореБрддрд╛рдмрд┐рдХ рдлреЗрд▓ рд╣реЛ рд╕рдХреЗрдВ, рдХреЛрдИ рдлрд░реНрдХ рдирд╣реАрдВ рдкрдбрд╝рддрд╛ рдЬрд╣рд╛рдВ рд╕рддреНрдпрд╛рдкрди рд╡рд┐рдлрд▓ рд╣реЛ рдЬрд╛рддрд╛ рд╣реИред рд╕реМрднрд╛рдЧреНрдп рд╕реЗ, рд╕рдорд╡рд░реНрддреАUnit рдПрдХ рд╣рд▓реНрдХрд╛ рдврд╛рдВрдЪрд╛ рдкреНрд░рджрд╛рди рдХрд░рддрд╛ рд╣реИ рдЬреЛ рдмрд╕ рдпрд╣реА рдХрд░рддрд╛ рд╣реИ: рд╡реЗрдЯрд░ред рдЪрд▓реЛ рдкрд┐рдЫрд▓реА рдмрд╛рд░ рдХреЗ рд▓рд┐рдП рдКрдкрд░ рд╕рдВрджреЗрд╢ рдкреНрд░рд╕рдВрд╕реНрдХрд░рдг рдкрд░реАрдХреНрд╖рдг рдХреЛ рдЕрдиреБрдХреВрд▓рд┐рдд рдХрд░реЗрдВ рдФрд░ рджреЗрдЦреЗрдВ рдХрд┐ рд╕рдорд╡рд░реНрддреА рдпреВрдиреАрдЯреЗрдЯрд░ рд╕реЗ рд╡реЗрдЯрд░ рд╣рдорд╛рд░реЗ рд▓рд┐рдП рдХреНрдпрд╛ рдХрд░ рд╕рдХрддрд╛ рд╣реИ:
String msg = "test"; Waiter waiter = new Waiter(); messageBus.registerHandler(message -> { waiter.assertEquals(message, msg); waiter.resume(); }; messageBus.publish(msg); waiter.await(1, TimeUnit.SECONDS);
рдЗрд╕ рдкрд░реАрдХреНрд╖рдг рдореЗрдВ, рд╣рдо рджреЗрдЦрддреЗ рд╣реИрдВ рдХрд┐ рд╡реЗрдЯрд░ рдиреЗ рд╣рдорд╛рд░реЗ рдХрд╛рдЙрдВрдЯрдбрд╛рдЙрди рд▓реЙрдЪ рдФрд░ рдПрдЯреЙрдорд┐рдХ рд░рд┐рдлрд░реЗрдВрд╕ рдХреА рдЬрдЧрд╣ рд▓реЗ рд▓реА рд╣реИред рд╡реЗрдЯрд░ рдХреЗ рд╕рд╛рде, рд╣рдо рдореБрдЦреНрдп рдЯреЗрд╕реНрдЯ рдереНрд░реЗрдб рдХреЛ рдмреНрд▓реЙрдХ рдХрд░рддреЗ рд╣реИрдВ, рдЯреЗрд╕реНрдЯ рдХрд░рддреЗ рд╣реИрдВ, рдлрд┐рд░ рдореБрдЦреНрдп рдЯреЗрд╕реНрдЯ рдереНрд░реЗрдб рдХреЛ рдлрд┐рд░ рд╕реЗ рд╢реБрд░реВ рдХрд░рддреЗ рд╣реИрдВ рддрд╛рдХрд┐ рдЯреЗрд╕реНрдЯ рдкреВрд░рд╛ рд╣реЛ рд╕рдХреЗред рдпрджрд┐ рдЪреЗрдХ рд╡рд┐рдлрд▓ рд╣реЛ рдЬрд╛рддрд╛ рд╣реИ, рддреЛ рд╡реЗрдЯрд░ рдХреЛ рдХреЙрд▓ рдХрд░рдирд╛ рд╣реЛрдЧрд╛ред рдмреИрдЯрд░реА рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рд░реВрдк рд╕реЗ рд▓реЙрдХ рдХреЛ рдЫреЛрдбрд╝ рджреЗрдЧреА рдФрд░ рдПрдХ рд╡рд┐рдлрд▓рддрд╛ рдХреЛ рдлреЗрдВрдХ рджреЗрдЧреА, рдЬрд┐рд╕рд╕реЗ рдкрд░реАрдХреНрд╖рдг рдкрд╛рд╕ рдпрд╛ рд╡рд┐рдлрд▓ рд╣реЛ рдЬрд╛рдПрдЧрд╛, рдЬреИрд╕рд╛ рдХрд┐ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП, рднрд▓реЗ рд╣реА рдЪреЗрдХ рджреВрд╕рд░реЗ рдзрд╛рдЧреЗ рд╕реЗ рдмрд╛рд╣рд░ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реЛред
рдФрд░ рднреА рд╕рдорд╛рдирд╛рдВрддрд░
рдЕрдм рдЬрдм рд╣рдо рдкреНрд░рдорд╛рдгрд┐рдд рдмрд╣реБ-рдереНрд░реЗрдбреЗрдб рдкрд░реАрдХреНрд╖рдХ рдмрди рдЧрдП рд╣реИрдВ, рддреЛ рд╣рдо рдпрд╣ рдкреБрд╖реНрдЯрд┐ рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ рдХрд┐ рдХрдИ рдЕрддреБрд▓реНрдпрдХрд╛рд▓рд┐рдХ рдХреНрд░рд┐рдпрд╛рдПрдВ рд╣реЛ рд░рд╣реА рд╣реИрдВред рд╕рдорд╡рд░реНрддреАUnit рдХреА рд╡реЗрдЯрд░ рдпрд╣ рд╕рд░рд▓ рдмрдирд╛рддрд╛ рд╣реИ:
Waiter waiter = new Waiter(); messageBus.registerHandler(message -> { waiter.resume(); }; messageBus.publish("one"); messageBus.publish("two"); waiter.await(1, TimeUnit.SECONDS, 2);
рдпрд╣рд╛рдВ рд╣рдо рдмрд╕ рдкрд░ рджреЛ рд╕рдВрджреЗрд╢ рдкреНрд░рдХрд╛рд╢рд┐рдд рдХрд░рддреЗ рд╣реИрдВ рдФрд░ рд╕рддреНрдпрд╛рдкрд┐рдд рдХрд░рддреЗ рд╣реИрдВ рдХрд┐ рджреЛрдиреЛрдВ рд╕рдВрджреЗрд╢ рд╡рд┐рддрд░рд┐рдд рдХрд┐рдП рдЧрдП рд╣реИрдВ, рдЬрд┐рд╕рд╕реЗ рд╡реЗрдЯрд░ рдХреЛ рдлрд┐рд░ рд╕реЗ рд╢реБрд░реВ рд╣реЛрдиреЗ рдХреА рдкреНрд░рддреАрдХреНрд╖рд╛ () 2 рдмрд╛рд░ рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИред рдпрджрд┐ рд╕рдВрджреЗрд╢реЛрдВ рдХреЛ рд╡рд┐рддрд░рд┐рдд рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ рдФрд░ рдлрд┐рд░ рд╕реЗ рд╢реБрд░реВ рдХреЛ 1 рд╕реЗрдХрдВрдб рдХреЗ рднреАрддрд░ рджреЛ рдмрд╛рд░ рдирд╣реАрдВ рдмреБрд▓рд╛рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рддреЛ рд╕рдордп-рдирд┐рд░реНрдзрд╛рд░рдг рддреНрд░реБрдЯрд┐ рдХреЗ рд╕рд╛рде рдкрд░реАрдХреНрд╖рдг рд╡рд┐рдлрд▓ рд╣реЛ рдЬрд╛рдПрдЧрд╛ред
рдЗрд╕ рджреГрд╖реНрдЯрд┐рдХреЛрдг рдХреЗ рд╕рд╛рде рдПрдХ рд╕рд╛рдорд╛рдиреНрдп рдЯрд┐рдк рдпрд╣ рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╣реИ рдХрд┐ рдЖрдкрдХреЗ рд╕рдордпрд╛рд╡рдзрд┐ рдХрд┐рд╕реА рднреА рд╕рдорд╡рд░реНрддреА рдХреНрд░рд┐рдпрд╛рдУрдВ рдХреЛ рдкреВрд░рд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдкрд░реНрдпрд╛рдкреНрдд рд╣реИрдВред рд╕рд╛рдорд╛рдиреНрдп рдкрд░рд┐рд╕реНрдерд┐рддрд┐рдпреЛрдВ рдореЗрдВ, рдЬрдм рдкрд░реАрдХреНрд╖рдг рдХреЗ рддрд╣рдд рдкреНрд░рдгрд╛рд▓реА рдЕрдкреЗрдХреНрд╖рд┐рдд рд░реВрдк рд╕реЗ рдХрд╛рдо рдХрд░рддреА рд╣реИ, рддреЛ рд╕рдордп рд╕рдорд╛рдкреНрдд рд╣реЛрдиреЗ рд╕реЗ рдХреЛрдИ рдлрд░реНрдХ рдирд╣реАрдВ рдкрдбрд╝рддрд╛ рд╣реИ рдФрд░ рдХрд┐рд╕реА рднреА рдХрд╛рд░рдг рд╕реЗ рд╕рд┐рд╕реНрдЯрдо рдХреА рд╡рд┐рдлрд▓рддрд╛ рдХреА рд╕реНрдерд┐рддрд┐ рдореЗрдВ рд╣реА рдкреНрд░рднрд╛рд╡реА рд╣реЛрддрд╛ рд╣реИред
рд╕рд╛рд░рд╛рдВрд╢
рдЗрд╕ рд▓реЗрдЦ рдореЗрдВ, рд╣рдордиреЗ рд╕реАрдЦрд╛ рдХрд┐ рдорд▓реНрдЯреАрдереНрд░реЗрдб рдпреВрдирд┐рдЯ рдкрд░реАрдХреНрд╖рдг рдмреБрд░рд╛ рдирд╣реАрдВ рд╣реИ рдФрд░ рдЗрд╕реЗ рдХрд░рдирд╛ рдХрд╛рдлреА рдЖрд╕рд╛рди рд╣реИред рд╣рдордиреЗ рд╕рд╛рдорд╛рдиреНрдп рджреГрд╖реНрдЯрд┐рдХреЛрдг рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд╕реАрдЦрд╛ рдЬрдм рд╣рдо рдореБрдЦреНрдп рдкрд░реАрдХреНрд╖рдг рдереНрд░реЗрдб рдХреЛ рдмреНрд▓реЙрдХ рдХрд░рддреЗ рд╣реИрдВ, рдХреБрдЫ рдЕрдиреНрдп рдереНрд░реЗрдбреНрд╕ рд╕реЗ рдЪреЗрдХ рдХрд░рддреЗ рд╣реИрдВ, рдФрд░ рдлрд┐рд░ рдореБрдЦреНрдп рдереНрд░реЗрдб рдХреЛ рдлрд┐рд░ рд╕реЗ рд╢реБрд░реВ рдХрд░рддреЗ рд╣реИрдВред рдФрд░ рд╣рдордиреЗ
ConcurrentUnit рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд╕реАрдЦрд╛, рдЬреЛ рдЗрд╕ рдХрд╛рд░реНрдп рдХреЛ рд╕реБрд╡рд┐рдзрд╛рдЬрдирдХ рдмрдирд╛ рд╕рдХрддрд╛ рд╣реИред
рдЦреБрд╢ рдкрд░реАрдХреНрд╖рдг!
@Middle_java рджреНрд╡рд╛рд░рд╛ рдЕрдиреБрд╡рд╛рджрд┐рдд