рдЬрд╛рд╡рд╛ 7 рдореЗрдВ рдлреЛрд░реНрдХ / рдЬреЙрдЗрди рдлреНрд░реЗрдорд╡рд░реНрдХ

рдХреБрдЫ рд╕рдордп рдкрд╣рд▓реЗ, рдореИрдВ рдЬрд╛рд╡рд╛ 7 рдореЗрдВ рдирд╡рд╛рдЪрд╛рд░реЛрдВ рдХреА рд╕рдореАрдХреНрд╖рд╛ рдХрд░ рд░рд╣рд╛ рдерд╛, рдФрд░, рдЕрдиреНрдп рдЪреАрдЬреЛрдВ рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдХреБрдЫ рдирд╡рд╛рдЪрд╛рд░реЛрдВ рдкрд░ рдЕрдзрд┐рдХ рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ рдЬрд╛рдиреЗ рдХреА рдзрдордХреА рджреАред рдХрд╛рдлреА рд╕рдордп рдмреАрдд рдЧрдпрд╛, рдЬрд╛рд╡рд╛ 7 рдореЗрдВ рд╡реЗ рдПрдХ рдЧрдВрднреАрд░ рджреЛрд╖ рдЦреЛрдЬрдиреЗ рдореЗрдВ рднреА рдХрд╛рдордпрд╛рдм рд░рд╣реЗ, рд▓реЗрдХрд┐рди рдЖрдЦрд┐рд░рдХрд╛рд░ рд╡рд╣ рдХреНрд╖рдг рдЖрдпрд╛ рдЬрдм рд╣рдорд╛рд░реЗ рд╡рд╛рджреЗ рдХреЛ рдкреВрд░рд╛ рдХрд░рдиреЗ рдХрд╛ рд╕рдордп рдЖ рдЧрдпрд╛ред рдЗрд╕рд▓рд┐рдП, рдХрдЯреМрддреА рдХреЗ рддрд╣рдд рдЖрдк рдПрдХ рд╡рд┐рд╡рд░рдг рдФрд░ рдирдП рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХрд╛ рдПрдХ рдЙрджрд╛рд╣рд░рдг рдкрд╛ рд╕рдХрддреЗ рд╣реИрдВ ExecutorService ExecutorService рдмреБрд▓рд╛рдпрд╛ рдЧрдпрд╛ ForkJoinPool ForkJoinPool ред рдЗрд╕ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреЛ рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ рдкреБрдирд░рд╛рд╡рд░реНрддреА рдХрд╛рд░реНрдпреЛрдВ рдХреЗ рд╕рдорд╛рдирд╛рдВрддрд░реАрдХрд░рдг рдХреЛ рд╕рд░рд▓ рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдбрд┐рдЬрд╝рд╛рдЗрди рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ рдФрд░ рдЗрд╕ рд╕рдорд╕реНрдпрд╛ рдХреЛ рд╣рд▓ рдХрд░рддрд╛ рд╣реИ рдХрд┐ рдЬрдм рдЙрдк-рдХрд╛рд░реНрдп рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛ рд░рд╣рд╛ рд╣реИ, рддреЛ рдЬреЛ рдереНрд░реЗрдб рдЙрддреНрдкрдиреНрди рд╣реЛрддрд╛ рд╣реИ рдЙрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред

рдЙрдкрдпреЛрдЧ рдХрд┐рдП рдЧрдП рдкреНрд░рдХрд╛рд░реЛрдВ рдХрд╛ рд╕рдВрдХреНрд╖рд┐рдкреНрдд рд╡рд┐рд╡рд░рдг

ForkJoinTask

рдпрд╣ рдПрдХ рдЕрдореВрд░реНрдд рд╡рд░реНрдЧ рд╣реИ, рдЬреЛ рдПрдХ рдЕрд░реНрде рдореЗрдВ, рдПрдХ рдзрд╛рд░рд╛ рдХрд╛ рдПрдХ рд╣рд▓реНрдХрд╛ рдПрдирд╛рд▓реЙрдЧ рд╣реИред рд▓рдмреНрдмреЛрд▓реБрдЖрдм рдпрд╣ рд╣реИ рдХрд┐ ForkJoinPool рдХреЗ рд▓рд┐рдП рдзрдиреНрдпрд╡рд╛рдж, рдЬрд┐рд╕рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдиреАрдЪреЗ рдЪрд░реНрдЪрд╛ рдХреА рдЬрд╛рдПрдЧреА, рдЖрдк рдереНрд░реЗрдбреНрд╕ рдХреА рдПрдХ рдЫреЛрдЯреА рд╕рдВрдЦреНрдпрд╛ рдореЗрдВ рдХрд╛рдлреА рдмрдбрд╝реА рд╕рдВрдЦреНрдпрд╛ рдореЗрдВ рдХрд╛рд░реНрдп рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рдпрд╣ рддрдерд╛рдХрдерд┐рдд рдХрд╛рд░реНрдп-рдЪреЛрд░реА рджреНрд╡рд╛рд░рд╛ рдкреНрд░рд╛рдкреНрдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдЬрдм рдиреАрдВрдж рдХрд╛ рдХрд╛рд░реНрдп рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рд╕реЛ рдирд╣реАрдВ рд░рд╣рд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдЕрдиреНрдп рдХрд╛рд░реНрдпреЛрдВ рдХрд╛ рдкреНрд░рджрд░реНрд╢рди рдХрд░ рд░рд╣рд╛ рд╣реИред рдЗрд╕ рд╡рд░реНрдЧ рдХреЗ рдХрдИ рджрд┐рд▓рдЪрд╕реНрдк рддрд░реАрдХреЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди рд╣рдо рдХреЗрд╡рд▓ рджреЛ рдкрд░ рдзреНрдпрд╛рди рдХреЗрдВрджреНрд░рд┐рдд рдХрд░реЗрдВрдЧреЗ: fork() , рдЬреЛ рдЕрддреБрд▓реНрдпрдХрд╛рд▓рд┐рдХ рдХрд╛рд░реНрдп рд▓реЙрдиреНрдЪ рдФрд░ join() , рдЬреЛ рдХрд╛рд░реНрдп рдХреЛ рдкреВрд░рд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЗрдВрддрдЬрд╛рд░ рдХрд░рддрд╛ рд╣реИ рдФрд░ рдЗрд╕рдХреЗ рдирд┐рд╖реНрдкрд╛рджрди рдХрд╛ рдкрд░рд┐рдгрд╛рдо рджреЗрддрд╛ рд╣реИред рд╕рднреА рддрд░реАрдХреЛрдВ рдХрд╛ рдЕрдзрд┐рдХ рд╡рд┐рд╕реНрддреГрдд рд╡рд┐рд╡рд░рдг рдЖрдзрд┐рдХрд╛рд░рд┐рдХ рджрд╕реНрддрд╛рд╡реЗрдЬ рдореЗрдВ рдкрд╛рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред

RecursiveAction рдФрд░ RecursiveTask

рдЕрдкрдиреЗ рдЖрдк рд╕реЗ, рдЗрд╕ рд╡рд░реНрдЧ рдХрд╛ рд╡реНрдпрд╛рд╡рд╣рд╛рд░рд┐рдХ рд░реВрдк рд╕реЗ рдЙрдкрдпреЛрдЧ рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рдЕрдзрд┐рдХрд╛рдВрд╢ рдХрд╛рд░реНрдпреЛрдВ рдХреЗ рд▓рд┐рдП рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдЕрдзрд┐рдХ рд╡рд┐рд╢рд┐рд╖реНрдЯ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рддреИрдпрд╛рд░ рд╣реИрдВ: RecursiveAction рдорд╛рдорд▓реЗ рдореЗрдВ RecursiveAction рдЖрдкрдХреЛ рдХрд┐рд╕реА рднреА рдореВрд▓реНрдп рдХреА рдЧрдгрдирд╛ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИ, рд▓реЗрдХрд┐рди рдЖрдкрдХреЛ рдмрд╕ рдХреБрдЫ рдХрд╛рд░реНрд░рд╡рд╛рдИ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ, рдФрд░ RecursiveTask RecursiveTask , рдЬрдм рдЖрдкрдХреЛ рдЕрднреА рднреА рдХреБрдЫ рд╡рд╛рдкрд╕ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред рдЬреИрд╕рд╛ рдХрд┐ рдЖрдк рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВ, рдпреЗ рджреЛ рд╡рд░реНрдЧ рдореМрдЬреВрджрд╛ рд▓реЛрдЧреЛрдВ рдХреЗ рд╕рдорд╛рди рд╣реИрдВред Runnable Runnable рдФрд░ Callable Callable ред

ForkJoinPool

рдЗрд╕ рд╡рд░реНрдЧ рдореЗрдВ, рд╡рд╛рд╕реНрддрд╡рд┐рдХ рдкреНрд░рд╡рд╛рд╣ рдХреЗ рдмреАрдЪ рд▓реЛрдб рд╕рдВрддреБрд▓рди рдХреЗ рдореБрд╢реНрдХрд┐рд▓ рддрд░реНрдХ рдХреЛ рд▓рд╛рдЧреВ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рд╕рд┐рджреНрдзрд╛рдВрдд рд░реВрдк рдореЗрдВ, рдмрд╛рд╣рд░ рд╕реЗ рдпрд╣ рд▓рдЧрднрдЧ рдзрд╛рдЧреЗ рдХреЗ рдПрдХ рдирд┐рдпрдорд┐рдд рдирд┐рдпрдорд┐рдд рдкреВрд▓ рдЬреИрд╕рд╛ рджрд┐рдЦрддрд╛ рд╣реИ, рдФрд░ рдЙрдкрдпреЛрдЧ рдореЗрдВ рдХреЛрдИ рд╡рд┐рд╢реЗрд╖ рд╡рд┐рд╢реЗрд╖рддрд╛рдПрдВ рдирд╣реАрдВ рд╣реИрдВред

рдлреНрд░реЗрдорд╡рд░реНрдХ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХрд╛ рдПрдХ рдЙрджрд╛рд╣рд░рдг


рд╣рдо рдПрдХ рдХрд╛рд░реНрдп рдХреЗ рд╕рд╛рде рдЖрдПрдВрдЧреЗ: рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдиреЛрдбреНрд╕ рдореЗрдВ рд▓рд┐рдЦреЗ рд╕рдВрдЦреНрдпрд╛рдУрдВ рдХреЗ рд╕рд╛рде рдХреБрдЫ рдкреЗрдбрд╝ рд╣реИрдВред рдРрд╕реА рд╕рднреА рд╕рдВрдЦреНрдпрд╛рдУрдВ рдХреЗ рдпреЛрдЧ рдХреА рдЧрдгрдирд╛ рдХрд░рдирд╛ рдЖрд╡рд╢реНрдпрдХ рд╣реИред рдЖрдкрд╕реА рд╕рдордЭ рдХреЛ рдмреЗрд╣рддрд░ рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП, рдореИрдВ рдЯреНрд░реА рдиреЛрдб рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рджреВрдВрдЧрд╛:
 public interface Node { Collection<Node> getChildren(); long getValue(); } 

рдЕрдм рд╣рдо рдПрдХ рдкреБрдирд░рд╛рд╡рд░реНрддреА рдХрд╛рд░реНрдп рдХрд╛ рд╡рд░реНрдгрди рдХрд░рддреЗ рд╣реИрдВ, рдЬреЛ рдХрдИ рдереНрд░реЗрдбреНрд╕ рдореЗрдВ рдЖрд╡рд╢реНрдпрдХ рд░рд╛рд╢рд┐ рдХреА рдЧрдгрдирд╛ рдХрд░рддрд╛ рд╣реИ, рдЬрд┐рд╕реЗ рд░рд┐рдХрд░реНрд╕рд┐рд╡рдЯреИрд╕реНрдХ рд╕реЗ рд╡рд┐рд░рд╛рд╕рдд рдореЗрдВ рдорд┐рд▓рд╛ рд╣реИред рд╣рдореЗрдВ рдХреЗрд╡рд▓ рдЧрдгрдирд╛ рд╡рд┐рдзрд┐ рдХреЛ рдУрд╡рд░рд░рд╛рдЗрдб рдХрд░рдиреЗ рдФрд░ fork() рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдФрд░ рдмреБрджреНрдзрд┐рдорд╛рдиреА рд╕реЗ рддрд░реАрдХреЛрдВ рдореЗрдВ join :
 public class ValueSumCounter extends RecursiveTask<Long>{ private final Node node; public ValueSumCounter(Node node) { this.node = node; } @Override protected Long compute() { long sum = node.getValue(); List<ValueSumCounter> subTasks = new LinkedList<>(); for(Node child : node.getChildren()) { ValueSumCounter task = new ValueSumCounter(child); task.fork(); //   subTasks.add(task); } for(ValueSumCounter task : subTasks) { sum += task.join(); //       } return sum; } } 

рдпрд╣ рдЖрд╕рд╛рди рд╣реИ, рд╣реИ рдирд╛? рдпрд╣ рдХреЗрд╡рд▓ рдПрдХ рдЕрд▓рдЧ ForkJoinPool рдореЗрдВ рдЗрд╕ рдЦреБрд╢реА рдХреЛ рдЪрд▓рд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдмрдиреА рд╣реБрдИ рд╣реИ:
 public static void main(String[] args) { Node root = getRootNode(); new ForkJoinPool().invoke(new ValueSumCounter(root)); } 

рдФрд░ рдЖрдк рдХрд░ рд░рд╣реЗ рд╣реИрдВ, рдЕрдкрдиреА рдЬреЗрдм рдореЗрдВ рдЧрдгрдирд╛ рдХрд╛ рдкрд░рд┐рдгрд╛рдо!

рдореБрдЭреЗ рдЗрд╕рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдХреНрдпреЛрдВ рд╣реИ?


рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ, Future<T> рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреА рддреБрд▓рдирд╛ рдореЗрдВ рд▓реЗрдЦрди рдЗрддрдирд╛ рдЕрдзрд┐рдХ рд╕реБрд╡рд┐рдзрд╛рдЬрдирдХ рдФрд░ рд╕рд╣рдЬ рд╣реИред рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдЬреИрд╕рд╛ рдХрд┐ рдореИрдВрдиреЗ рдкрд╣рд▓реЗ рд▓рд┐рдЦрд╛ рдерд╛, рдХрд╛рдВрдЯрд╛-рдирд╛рдХ рд╡рд╛рд▓реЗ рдХрд╛рд░реНрдп рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рд╕рдорд░реНрдкрд┐рдд рд╡рд╛рд╕реНрддрд╡рд┐рдХ рдзрд╛рдЧрд╛ рдмрд┐рд▓реНрдХреБрд▓ рднреА рдЖрд╡рд╢реНрдпрдХ рдирд╣реАрдВ рд╣реИред рдЗрд╕рдХреЗ рд╡рд┐рдкрд░реАрдд, рдкрд╣рд▓реЗ рд╕реЗ рдореМрдЬреВрдж рдереНрд░реЗрдбреНрд╕ рдЬреЛ рд╡рд░реНрддрдорд╛рди рдореЗрдВ рд╢рд╛рдорд┐рд▓ рд╣реИрдВ, рд╕рдХреНрд░рд┐рдп рд░реВрдк рд╕реЗ рдЙрдкрдпреЛрдЧ рдХрд┐рдП рдЬрд╛рддреЗ рд╣реИрдВред рдпрд╣, рдЬрд╛рд╣рд┐рд░ рд╣реИ, рдЙрддреНрдкрд╛рджрдХрддрд╛ рдореЗрдВ рдЙрд▓реНрд▓реЗрдЦрдиреАрдп рд╡реГрджреНрдзрд┐ рджреЗрддрд╛ рд╣реИред рдореИрдВрдиреЗ рдмреЗрдВрдЪрдорд╛рд░реНрдХ рдХрд╛ рд╕рдВрдЪрд╛рд▓рди рд╢реБрд░реВ рдирд╣реАрдВ рдХрд┐рдпрд╛, рдХреНрдпреЛрдВрдХрд┐ рдореБрдЭреЗ рдпрдХреАрди рд╣реИ рдХрд┐ рдУрд░реЗрдХрд▓ рдХреЗ рдЗрдВрдЬреАрдирд┐рдпрд░реЛрдВ рдиреЗ рдкрд╣рд▓реЗ рд╣реА рдореЗрд░реЗ рд▓рд┐рдП рдРрд╕рд╛ рдХрд┐рдпрд╛ рдерд╛ред

рдЬрд╛рд╡рд╛ 7 рдХреЗ рд╕рд╛рде рдЕрдкрдиреЗ рд╢реЛрдз рдореЗрдВ рд╕рдлрд▓рддрд╛ :)

Source: https://habr.com/ru/post/In128985/


All Articles