рдЬреЗрдбреАрдХреЗ рдХреЗ рд╕рд╛рддрд╡реЗрдВ рд╕рдВрд╕реНрдХрд░рдг рдХреА рд░рд┐рд╣рд╛рдИ рдХреЗ рд╕рд╛рде, рд╣рдо,
рдЬрд╛рд╡рд╛ рдбреЗрд╡рд▓рдкрд░реНрд╕ рдХреЛ рдЦреБрд╢ рдХрд░рддреЗ рд╣реБрдП,
рдлреЛрд░реНрдХ / рдЬреЙрдЗрди рдлреНрд░реЗрдорд╡рд░реНрдХ рд╕реЗ рдЙрдкрд▓рдмреНрдз рд╣реЛ рдЧрдП, рдЬреЛ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА
рдпрд╣рд╛рдВ рд╣рдм рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд▓рд┐рдЦрд╛ рдЧрдпрд╛ рдерд╛ред рдПрдкреАрдЖрдИ рдХреЗ рд╕рдВрджрд░реНрдн рдореЗрдВ рд░реВрдкрд░реЗрдЦрд╛ рдкрд╣рд▓реЗ рд╕реЗ рдкрд░рд┐рдЪрд┐рдд
ExecutorService s рдХреЗ рд╕рдорд╛рди рд╣реИ, рд▓реЗрдХрд┐рди рдпрд╣ рдПрдХ рдмрд╣реБрдд рд╣реА рдареЛрд╕ рдкреНрд░рджрд░реНрд╢рди рдХреЛ рдмрдврд╝рд╛рд╡рд╛ рджреЗрддрд╛ рд╣реИ рдФрд░ рдзрд╛рдЧреЗ рдХреА рд╡рд╛рд╕реНрддрд╡рд┐рдХ "рд▓рдкрдЯ" рд╣реИред
рдпрд╣рд╛рдБ, рдореИрдВ рдЗрд╕ рдмрд╛рдд рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░рдирд╛ рдЪрд╛рд╣реВрдБрдЧрд╛ рдХрд┐
рдлреЛрд░реНрдХ / рдЬреЙрдЗрди рдХрд░рддреЗ рд╕рдордп рдЖрдкрдХреЛ рдХреНрдпрд╛ рдзреНрдпрд╛рди рджреЗрдирд╛ рдЪрд╛рд╣рд┐рдПред
рдереНрд░реЗрдбрд▓реЛрдХ рдЪрд░
ExecutorService рдХреЗ рд╕рд╛рде, рд╣рдорд╛рд░реА рдЧрд╛рд░рдВрдЯреА рдереА рдХрд┐ рд╢реБрд░реБрдЖрдд рд╕реЗ рдЕрдВрдд рддрдХ рдПрдХ рд╣реА рдХрд╛рд░реНрдп рдПрдХ рд╣реА рдзрд╛рдЧреЗ рджреНрд╡рд╛рд░рд╛ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред
рдлреЛрд░реНрдХ / рдЬреЙрдЗрди рдореЗрдВ , рдереНрд░реЗрдбрд┐рдВрдЧ рдореЗрдВ рдмрдбрд╝реЗ рдмрджрд▓рд╛рд╡ рд╣реБрдП рд╣реИрдВред рдХрд╛рд░реНрдп (
ForkJoinTask рдХреЗ) рдзрд╛рдЧреЗ рдХреА рддреБрд▓рдирд╛ рдореЗрдВ рдЕрд▓рдЧ рд╢рдмреНрджрд╛рд░реНрде рд╣реИрдВ: рдПрдХ рдзрд╛рдЧрд╛ рдХрдИ рдХрд╛рд░реНрдпреЛрдВ рдХреЛ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд░ рд╕рдХрддрд╛ рд╣реИ рдЬреЛ рд╕рдордп рдореЗрдВ рдкреНрд░рддрд┐рдЪреНрдЫреЗрдж рдХрд░рддреЗ рд╣реИрдВред
рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдЬрдм рдХреЙрд▓рд┐рдВрдЧ.
in.inoke () , рдПрдХ рдкрд░рд┐рджреГрд╢реНрдп рдХрд╛рдлреА рд╕рдВрднрд╡ рд╣реИ рдЬрдм рдореВрд▓ рдХрд╛рд░реНрдп рдХреЛ рдПрдХ рдереНрд░реЗрдб рджреНрд╡рд╛рд░рд╛ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛, рддреЛ рдЙрд╕реА рдереНрд░реЗрдб рдиреЗ рдПрдХ рдирдпрд╛ рдХрд╛рд░реНрдп
рдХрд╛рд░реНрдп рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд░рдирд╛ рд╢реБрд░реВ рдХрд░ рджрд┐рдпрд╛ред рдпрд╣ рддреЗрдЬреА рд╕реЗ рд╣реИ: рдЖрдкрдХреЛ рдПрдХ рдФрд░ рдзрд╛рдЧрд╛ рд╢реБрд░реВ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИ рдФрд░ рд╣рдо рд╕рдВрджрд░реНрдн рд╕реНрд╡рд┐рдЪрд┐рдВрдЧ рд╕реЗ рдмрдЪрддреЗ рд╣реИрдВред
рдХрд╛рд░реНрдп рдХреА рд╕рдорд╛рдкреНрддрд┐ рдХреЗ рдмрд╛рдж
, рдореВрд▓ рдХрд╛рд░реНрдп рдиреЗ рдЕрдкрдиреЗ рдирд┐рд╖реНрдкрд╛рджрди рдХреЛ рдЬрд╛рд░реА рд░рдЦрд╛ред
рдЗрд╕рд▓рд┐рдП, рд╕реНрдерд╛рдиреАрдп рдкреНрд░рд╡рд╛рд╣ рдЪрд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рджреГрд╖реНрдЯрд┐рдХреЛрдг рдХреА рд╕рдореАрдХреНрд╖рд╛ рдХреА рдЬрд╛рдиреА рдЪрд╛рд╣рд┐рдПред
рдереНрд░реЗрдбрд▓реЙрдХ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрдИ рдорд╛рдорд▓реЛрдВ рдореЗрдВ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ:
- рдХрд┐рд╕реА рднреА рдЧреИрд░-рдереНрд░реЗрдб-рд╕реБрд░рдХреНрд╖рд┐рдд рдЙрдкрдпреЛрдЧрд┐рддрд╛ рд╡рд░реНрдЧ рдХреЗ рднрдВрдбрд╛рд░рдг рдХреЗ рд▓рд┐рдПред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, SimpleDateFormat ред рдЬрд┐рд╕рдХрд╛ рдирд┐рд░реНрдорд╛рдг рдмрд╣реБрдд рдорд╣рдВрдЧрд╛ рд╣реИ, рдФрд░ рдХрдИ рдереНрд░реЗрдб рдХрд╛ рдЙрдкрдпреЛрдЧ рдЧрд▓рдд рд╕рдВрдЪрд╛рд▓рди рдФрд░ рдЕрдкрд╡рд╛рджреЛрдВ рд╕реЗ рднрд░рд╛ рд╣реБрдЖ рд╣реИред
- рдХрд┐рд╕реА рдереНрд░реЗрдб рдирд┐рд╖реНрдкрд╛рджрди рд╕рдВрджрд░реНрдн рдХреЛ рд╕рдВрдЧреНрд░рд╣реАрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдПред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рд╡рд░реНрддрдорд╛рди рд▓реЗрди-рджреЗрди, рдбреЗрдЯрд╛рдмреЗрд╕ рд╕реЗ рдПрдХ рдХрдиреЗрдХреНрд╢рди, рдЖрджрд┐ рдпрд╛ рдбреЗрдЯрд╛ рдЬреЛ рдХреЗрд╡рд▓ рд╡рд┐рдзрд┐ рд╣рд╕реНрддрд╛рдХреНрд╖рд░ рдпрд╛ рд╕реЗрдЯрд░ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рд╕реНрдерд╛рдирд╛рдВрддрд░рд┐рдд рдХрд░рдиреЗ рдХрд╛ рдирд┐рд░реНрдгрдп рд▓реЗрддреЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди рд╕рдВрджрд░реНрдн рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдзрд╛рд░рд╛ рдХреЗ рд▓рд┐рдПред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, Struts2 рдореЗрдВ ActionContext ред
рдпрджрд┐ рдкрд╣рд▓реЗ рдорд╛рдорд▓реЗ рдореЗрдВ
рдлреЛрд░реНрдХ / рдЬреЙрдЗрди рдХрд░рддреЗ рд╕рдордп рдХреБрдЫ рднреА рднрдпрд╛рдирдХ рдирд╣реАрдВ рд╣реЛрддрд╛ рд╣реИ, рддреЛ рджреВрд╕рд░реЗ рдореЗрдВ, рдПрдХ рдХрд╛рд░реНрдп рдХреЗ рд╕реНрдерд╛рдиреАрдп рдЪрд░ рджреВрд╕рд░реЗ рдХреЗ рд▓рд┐рдП рдЙрдкрд▓рдмреНрдз рд╣реЛ рдЬрд╛рдПрдВрдЧреЗред
Moral : рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ
рдереНрд░реЗрдбрд▓реЛрдХ рд╡реИрд░рд┐рдПрдмрд▓ рдХрд╛ рдЙрдкрдпреЛрдЧ рди рдХрд░реЗрдВ, рдпрд╛
ForKJoinTask рдХрд╛ рд╕рдорд░реНрдерди рдХрд░рдиреЗ рд╡рд╛рд▓реЗ рдЕрдкрдиреЗ
рдереНрд░реЗрдбрд▓реЛрдХ рдПрдирд╛рд▓реЙрдЧ рдХреЛ рд▓рд╛рдЧреВ рдХрд░реЗрдВред
рдЕрд╡рд░реБрджреНрдз
рд╕рд╛рдорд╛рдиреНрдп рддреМрд░ рдкрд░, рдлреНрд░реЗрдорд╡рд░реНрдХ рд▓реЙрдХрд┐рдВрдЧ рдФрд░ рд╕рд┐рдВрдХреНрд░рдирд╛рдЗрдЬрд╝реЗрд╢рди рдХреЗ рдЕрдиреНрдп рд╕рд╛рдзрдиреЛрдВ рдХреЗ рдЙрдкрдпреЛрдЧ рдкрд░ рдкреНрд░рддрд┐рдмрдВрдз рдирд╣реАрдВ рд▓рдЧрд╛рддрд╛ рд╣реИред рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдпрд╣ рдЕрдиреНрдп рдереНрд░реЗрдбреНрд╕ (
рдереНрд░реЗрдб рднреБрдЦрдорд░реА ) рдХреА рдкреНрд░рддреАрдХреНрд╖рд╛ рдХрд░рддреЗ рд╕рдордп рдереНрд░реЗрдб рд╣реИрдВрдЧ рдХреА рд╕реНрдерд┐рддрд┐рдпреЛрдВ рд╕реЗ рдмрдЪрдиреЗ рдореЗрдВ рдорджрдж рдХрд░рддрд╛ рд╣реИред
рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рд╣рдорд╛рд░реЗ рдкрд╛рд╕
ThreadPoolExecutor рд╣реИ , рдКрдкрд░ рд╕реЗ рд╕реАрдорд┐рдд рдкреВрд▓ рдЖрдХрд╛рд░ рдХреЗ рд╕рд╛рдеред рдорд╛рди рд▓реАрдЬрд┐рдП рдХрд┐ рдпрд╣ рдПрдХ рд╣реИ, рд╕рд╛рджрдЧреА рдХреЗ рд▓рд┐рдПред рд╣рдо рдПрдХ рдзрд╛рдЧрд╛ рд╢реБрд░реВ рдХрд░рддреЗ рд╣реИрдВ, рдЬреЛ рдмрджрд▓реЗ рдореЗрдВ рдХрддрд╛рд░ рдореЗрдВ рдПрдХ рдФрд░ рдзрд╛рдЧрд╛ рдЬреЛрдбрд╝рддрд╛ рд╣реИ рдФрд░ рдЗрд╕рдХреЗ рдкреВрд░рд╛ рд╣реЛрдиреЗ рдХрд╛ рдЗрдВрддрдЬрд╛рд░ рдХрд░рддрд╛ рд╣реИред рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ, рд╣рдо рджреЛрдиреЛрдВ рдкреНрд░рд╡рд╛рд╣ рдХреА рдкреНрд░рддреАрдХреНрд╖рд╛ рдХрднреА рдирд╣реАрдВ рдХрд░реЗрдВрдЧреЗред рдпрджрд┐ рдкреВрд▓ рдмрдбрд╝рд╛ рд╣реИ, рддреЛ рд╣рдо рдЙрд╕ рдорд╛рдорд▓реЗ рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдЬрдм рдЕрдиреНрдп рдзрд╛рдЧреЗ рдПрдХ рджреВрд╕рд░реЗ рдХреА рдкреНрд░рддреАрдХреНрд╖рд╛ рдХрд░ рд░рд╣реЗ рд╣реИрдВ рдФрд░ рдЧрддрд┐рд░реЛрдз рдореЗрдВ рд╣реИрдВред рдпрд╛ рдФрд░ рднреА рд╕рд░рд▓, рдПрдХ рдХрд╛рд░реНрдп рдиреЗ рдПрдХ рджреВрд╕рд░реЗ рдХреЛ рдЬрдиреНрдо рджрд┐рдпрд╛, рддреАрд╕рд░рд╛, рдФрд░ рдЗрд╕реА рддрд░рд╣, рдФрд░ рд╣рд░ рдХреЛрдИ рдЪрд▓ рд░рд╣реЗ рдХрд╛рд░реНрдпреЛрдВ рдХреЗ рдкрд░рд┐рдгрд╛рдореЛрдВ рдХреА рдкреНрд░рддреАрдХреНрд╖рд╛ рдХрд░ рд░рд╣рд╛ рд╣реИред
рд╕рдорд╕реНрдпрд╛ рдХрд╛ рд╣рд┐рд╕реНрд╕рд╛ рдЗрд╕ рддрдереНрдп рд╕реЗ рд╣рд▓ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ рдХрд┐
рд╕рдореНрдорд┐рд▓рд┐рдд () рдЕрдирд┐рд╡рд╛рд░реНрдп рд░реВрдк рд╕реЗ рдереНрд░реЗрдб рдХреЛ рдкреВрд▓ рдореЗрдВ рд▓реМрдЯрд╛рддрд╛ рд╣реИред
рд╕рдорд╕рд╛рдордпрд┐рдХрддрд╛ рдХреЗ рдЖрд╡рд╢реНрдпрдХ рд╕реНрддрд░ рдХреЛ рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП,
ForJJoinPool рдПрдХ рдирд┐рдпрдВрддреНрд░рд┐рдд рд▓реЙрдХрд┐рдВрдЧ рддрдВрддреНрд░ рдкреНрд░рджрд╛рди рдХрд░рддрд╛ рд╣реИред
ForkJoinPool.ManagedBlocker рд╡рд░реНрдЧ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ
рд╣реБрдП, рд╣рдо
ForkJoinPool 'y рдХреЛ рдмрддрд╛ рд╕рдХрддреЗ рд╣реИрдВ рдХрд┐ рдереНрд░реЗрдб рд▓реЙрдХ рдХреЗ рдЗрдВрддрдЬрд╛рд░ рдореЗрдВ рдмреНрд▓реЙрдХ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ рдФрд░
ForkJoinPool рдирд┐рд░реНрджрд┐рд╖реНрдЯ рд╕реНрддрд░ рдХреЗ рд╕рдорд╛рдирддрд╛ рдкреНрд░рджрд╛рди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдЕрддрд┐рд░рд┐рдХреНрдд рдереНрд░реЗрдб рдмрдирд╛рдПрдЧрд╛ред
рдорд╛рди рд▓реАрдЬрд┐рдП рдХрд┐ рд╣рдо рдЕрдкрдиреЗ рдХреЛрдб рдореЗрдВ
ReentrantLock рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВред рд╣рдореЗрдВ
ForkJoinPool.anagedBlocker рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдХреЛ рдирд┐рдореНрдирд╛рдиреБрд╕рд╛рд░ рд▓рд╛рдЧреВ рдХрд░рдирд╛
рд╣реЛрдЧрд╛ (javadocs рд╕реЗ рд▓рд┐рдпрд╛ рдЧрдпрд╛):
class ManagedLocker implements ManagedBlocker { final ReentrantLock lock; boolean hasLock = false; ManagedLocker(ReentrantLock lock) { this.lock = lock; } public boolean block() { if (!hasLock) lock.lock(); return true; } public boolean isReleasable() { return hasLock || (hasLock = lock.tryLock()); } }
рдФрд░ рдХреЛрдб рдореЗрдВ рдирд┐рдореНрдирд╛рдиреБрд╕рд╛рд░ рд▓реЙрдХ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВ:
ReentrantLock lock = new ReentrantLock();
рд╡рд╣ рд╕рдм рд╣реИред
рдФрд░ рдмрд▓ рдЖрдкрдХреЗ рд╕рд╛рде рдЖ рд╕рдХрддрд╛ рд╣реИ!