рд╡реНрдпрд╡рд╣рд╛рд░ рдореЗрдВ рдмрд╣реБрдЖрдпрд╛рдореА

рдХрд┐рд╕реА рддрд░рд╣ рдореБрдЭреЗ рд╕реНрдЯреИрдХ рдУрд╡рд░рдлреНрд▓реЛ рдкрд░ рдПрдХ рдкреНрд░рд╢реНрди ( рд▓рд┐рдВрдХ ) рдорд┐рд▓рд╛ред
Need to create java CLI programm that searchs for specific files matched some pattern. Need to use multi-threading approach without using util.concurrent package and to provide good performance on parallel controllers.
рдЕрдиреБрд╡рд╛рдж
, - . , util.concurrent. .


рд╕рд╛рдорд╛рдиреНрдп рддреМрд░ рдкрд░, рд╕рд┐рджреНрдзрд╛рдВрдд рдореЗрдВ, рд╡рд┐рдЪрд╛рд░ рдЬрдЯрд┐рд▓ рдирд╣реАрдВ рдерд╛ред рдХреНрдпреЛрдВрдХрд┐ рдЗрд╕ рд╕реНрдерд┐рддрд┐ рдореЗрдВ, рдЖрдк use.concurrent рдХрд╛ рдЙрдкрдпреЛрдЧ рдирд╣реАрдВ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рддреЛ рдЖрдкрдХреЛ рдЕрдкрдиреЗ рд╕реНрд╡рдпрдВ рдХреЗ рдереНрд░реЗрдб рдкреВрд▓ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ, рд╕рд╛рде рд╣реА рдХреБрдЫ рдХрд╛рд░реНрдп рд▓рд┐рдЦреЗрдВ рдЬреЛ рдЗрд╕ рдереНрд░реЗрдб рдкреВрд▓ рдореЗрдВ рд╕реНрдкрд┐рди рдХрд░реЗрдВрдЧреЗред
рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдореБрдЭреЗ рдпрдХреАрди рдирд╣реАрдВ рдерд╛ рдХрд┐ IO рдХреЗ рдмрд╣реБ-рдереНрд░реЗрдбреЗрдб рдЙрдкрдпреЛрдЧ рдХреЗ рд╕рд╛рде рдЙрддреНрдкрд╛рджрдХрддрд╛ рдореЗрдВ рд╡реГрджреНрдзрд┐ рд╣реЛрдЧреАред

рдореБрдЭреЗ рддреБрд░рдВрдд рдХрд╣рдирд╛ рд╣реЛрдЧрд╛ рдХрд┐ рд▓рдХреНрд╖реНрдп рдХрд╛рд░реНрдп рдХреЛ рдкреВрд░рд╛ рдХрд░рдирд╛ рдирд╣реАрдВ рдерд╛, рд▓реЗрдХрд┐рди рд╕рдорд╕реНрдпрд╛ рдХреА рдЬрд╛рдВрдЪ рдХрд░рдирд╛, рдЗрд╕рд▓рд┐рдП рд╕рднреА рдХреЛрдб рд╕реБрдВрджрд░ рдирд╣реАрдВ рд╣реЛрдВрдЧреЗред

рд╕рд┐рджреНрдзрд╛рдВрдд рд░реВрдк рдореЗрдВ, рдПрд▓реНрдЧреЛрд░рд┐рдереНрдо рдПрдХ рдкреБрдирд░рд╛рд╡рд░реНрддреА рдкреЗрдбрд╝ рдЯреНрд░реИрд╡рд░реНрд╕рд▓ рдХреЗ рд╕рдорд╛рди рд╣реИ, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдЗрд╕рдХрд╛ рд╕рд░рд▓ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рд▓рд┐рдВрдХ
  import java.io.File; public class MainEntry { public static void main(String[] args) { walkin(new File("/home/user")); //Replace this with a suitable directory } /** * Recursive function to descend into the directory tree and find all the files * that end with ".mp3" * @param dir A file object defining the top directory **/ public static void walkin(File dir) { String pattern = ".mp3"; File listFile[] = dir.listFiles(); if(listFile != null) { for(int i=0; i<listFile.length; i++) { if(listFile[i].isDirectory()) { walkin(listFile[i]); } else { if(listFile[i].getName().endsWith(pattern)) { System.out.println(listFile[i].getPath()); } } } } } } 


рдкрд╣рд▓реЗ, рдЖрдЗрдП рджреЗрдЦреЗрдВ рдХрд┐ рдПрдХрд▓-рдереНрд░реЗрдбреЗрдб рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХрд┐рддрдиреА рддреЗрдЬрд╝реА рд╕реЗ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ, рдореИрдВрдиреЗ рдПрдХрд▓-рдереНрд░реЗрдбреЗрдб рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХрд╛ рдХреЛрдб рдирд╣реАрдВ рджрд┐рдпрд╛ рд╣реИ, рдпрд╣ рд╕рдВрдЧреНрд░рд╣ рдореЗрдВ рд╣реИред
рдкрд░рд┐рдгрд╛рдо рдЗрд╕ рдкреНрд░рдХрд╛рд░ рд╣реИрдВ:
154531 рдПрдордПрд╕

рдЕрдм рд╣рдо рдРрд╕рд╛ рд╣реА рдХрд░рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░рддреЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди рд╣рдо рдПрд▓реНрдЧреЛрд░рд┐рдереНрдо рдХреЗ рдмрд╣реБ-рдереНрд░реЗрдбреЗрдб рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВрдЧреЗред

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

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

рдпрд╣рд╛рдБ рдХреЛрдб рд╣реИ:
 import java.util.ArrayList; import java.util.List; class BacklogWorker extends Thread { /*      */ private final LinkedList<Runnable> backlog = new LinkedList<Runnable>(); private static final int INITIAL_CAPACITY = 100; /*   ,    */ private final List<Runnable> workQueue = new ArrayList<Runnable>(INITIAL_CAPACITY); BacklogWorker(String name) { super(name); } /*   */ synchronized void enque(Runnable work) { if (work != null) { backlog.add(work); } notify(); } public void run() { while (!isInterrupted()) { /*      ,   */ synchronized (this) { if (backlog.isEmpty()) { try { wait(); } catch (InterruptedException e) { interrupt(); } } int size = backlog.size(); for (int i = 0; i < INITIAL_CAPACITY && i < size; i++) { workQueue.add(backlog.poll()); } backlog.clear(); } for (Runnable task : workQueue) { try { task.run(); } catch (RuntimeException e) { e.printStackTrace(); } } workQueue.clear(); } } } 


рдЕрдм рд╣рдореЗрдВ рдПрдХ рдереНрд░реЗрдбрдкреВрд▓ рдмрдирд╛рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ рдЬреЛ рдЗрд╕рдХреЗ рдереНрд░реЗрдбреНрд╕ рдХреЗ рдмреАрдЪ рдХрд╛рдо рдХреЛ рд╡рд┐рддрд░рд┐рдд рдХрд░реЗрдЧрд╛ред
рдХрдХреНрд╖рд╛ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛рдПрдБ рдЗрд╕ рдкреНрд░рдХрд╛рд░ рд╣реИрдВ:
- рдереНрд░реЗрдбрд╕реЗрдлрд╝
- рд╕реНрдХреЗрд▓реЗрдмрд▓
- рдХрд╛рд░реНрдп рдХреЗ рдХрд╛рдо рдХрд░ рд░рд╣реЗ рдзрд╛рдЧреЗ рдХреЗ рдмреАрдЪ рдПрдХ рд╕рдорд╛рди рд╡рд┐рддрд░рдг
- рдЕрд╡рд░реБрджреНрдз рдирд╣реАрдВ

рдХреЛрдб рдирд┐рдореНрдирд╛рдиреБрд╕рд╛рд░ рд╣реИ:
  import java.util.concurrent.Executor; public class BacklogThreadPool implements Executor/*i don't use anything from concurrent, just only one interface*/ { private final BacklogWorker workers[]; private final int mask; private static volatile int sequence; public BacklogThreadPool(int threadCount, String id) { int tc; for (tc = 1; tc < threadCount; tc <<= 1) ; mask = tc - 1; if (id == null) { id = Integer.toString(getSequence()); } workers = new BacklogWorker[tc]; for (int i = 0; i < tc; i++) { workers[i] = new BacklogWorker((new StringBuilder()).append("thead-pool-worker-").append(id).append(":").append(i).toString()); workers[i].start(); } } private synchronized int getSequence() { return sequence++; } public void shutdown() { for (int i = 0; i < workers.length; i++) workers[i].interrupt(); } @Override public void execute(Runnable command) { workers[command.hashCode() & mask].enque(command); } } 

рд╕рд┐рджреНрдзрд╛рдВрдд рд░реВрдк рдореЗрдВ, рдпрд╣рд╛рдВ рд╕рдм рдХреБрдЫ рд╕реНрдкрд╖реНрдЯ рд╣реИ, рдФрд░ рд╢рд╛рдпрдж рдЗрд╕ рдкрд░ рдЯрд┐рдкреНрдкрдгреА рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХреБрдЫ рднреА рдирд╣реАрдВ рд╣реИред

рдЕрдм рд╣рдореЗрдВ рдПрдХ рдХрд╛рд░реНрдп рд▓рд┐рдЦрдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ рдЬрд┐рд╕реЗ рдереНрд░реЗрдбрдкреВрд▓ рдореЗрдВ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ред
рджреБрд░реНрднрд╛рдЧреНрдп рд╕реЗ, рдореЗрд░реЗ рд▓рд┐рдП рдкрд╣рд▓рд╛ рд╕рдВрд╕реНрдХрд░рдг рдЦреЛ рдЧрдпрд╛ рдерд╛, рдЗрд╕рд▓рд┐рдП рдореИрдВ рдлрд┐рд░ рд╕реЗ рдПрдХ рддреНрд╡рд░рд┐рдд рд▓рд┐рдЦрд┐рдд рд╕рдВрд╕реНрдХрд░рдг рд▓рд╛ рд░рд╣рд╛ рд╣реВрдВред
 import java.io.File; import java.util.ArrayList; import java.util.List; import java.util.regex.Matcher; import java.util.regex.Pattern; public class WalkinTask1 implements BacklogTask { private List<File> dirs; private ParseHandler parseHandler; public WalkinTask1(List<File> dirs, ParseHandler parseHandler) { this.parseHandler = parseHandler; //this.parseHandler.taskStart(); this.parseHandler.taskStartUnblock(); this.dirs = dirs; } @Override public void run() { try { List<String> filePaths = new ArrayList<String>(); List<File> dirPaths = new ArrayList<File>(); for (File dir : dirs) { if (!dirPaths.isEmpty()) { dirPaths = new ArrayList<File>(); } if (!filePaths.isEmpty()) { filePaths = new ArrayList<String>(); } File listFile[] = dir.listFiles(); if (listFile != null) { for (File file : listFile) { if (file.isDirectory()) { dirPaths.add(file); } else { filePaths.add(file.getPath()); } } } if (!dirPaths.isEmpty()) { parseHandler.schedule(TaskFactory.createWalking1Task(parseHandler, dirPaths)); } if (!filePaths.isEmpty()) { Pattern pattern = parseHandler.getPattern(); List<String> result = new ArrayList<String>(); for (String path : filePaths) { Matcher matcher = pattern.matcher(path); while (matcher.find()) { String str = matcher.group(); if (!"".equals(str)) { result.add(str); } } } parseHandler.taskComplete(result); } } } finally { //parseHandler.taskFinish(); parseHandler.taskFinishUnblock(); } } @Override public int getTaskType() { return 1; //TODO } } 


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

рдЕрдм рдкреНрд░реЛрдлрд╛рдЗрд▓рд░ рдореЗрдВ рдкрд░рд┐рдгрд╛рдо рджреЗрдЦреЗрдВ:
рдХрд╛рд░реНрдпрдХреНрд░рдо рдХрд╛ рдирд┐рд╖реНрдкрд╛рджрди рд╕рдордп:
рдХреБрд▓ рдХрд╛рд░реНрдп: 78687
55188ms

рдирддреАрдЬрддрди, рдХрд╛рдо рдХреА рдЧрддрд┐ рд▓рдЧрднрдЧ 3 рдЧреБрдирд╛ рдмрдврд╝ рдЧрдИред


рдпрд╣рд╛рдВ рд╣рдо рджреЗрдЦрддреЗ рд╣реИрдВ рдХрд┐ рдереНрд░реЗрдб рдкреВрд▓ рдХреЗ рд╕рднреА рдзрд╛рдЧреЗ рд▓рдЧрднрдЧ рдкреВрд░реЗ рд╕рдордп рдХрд╛рдо рдореЗрдВ рд╡реНрдпрд╕реНрдд рдереЗред рд▓рдЧрднрдЧ рдХреЛрдИ рдереНрд░реЗрдб рд▓реЙрдХ рдирд╣реАрдВ рд╣реИрдВред

рджреВрд╕рд░реА рддрд╕реНрд╡реАрд░ рдореЗрдВ рд╣рдо рджреЗрдЦрддреЗ рд╣реИрдВ рдХрд┐ рдЬреНрдпрд╛рджрд╛рддрд░ рд╕рдордп CPU IO рдкрд░ рдЦрд░реНрдЪ рд╣реЛрддрд╛ рд╣реИред

рдпрд╣рд╛рдБ рд╣рдо рджреЗрдЦрддреЗ рд╣реИрдВ рдХрд┐ CPU рдЙрдкрдпреЛрдЧ> 80% рд╣реИред

рдпрд╣рд╛рдВ рд╣рдореЗрдВ рдХреЗрд╡рд▓ рдПрдХ рдереНрд░реЗрдб рд▓реЙрдХ рджрд┐рдЦрд╛рдИ рджреЗрддрд╛ рд╣реИ, рдЬреЛ рдХрд┐ 1ms рд╕реЗ рдХрдо рд╕рдордп рд▓реЗрддрд╛ рд╣реИ, 78 рд╣рдЬрд╛рд░ рдХрд╛рд░реНрдпреЛрдВ рдХреЗ рд╕рд╛рде рдПрдХ рдмрд╣реБрдд рдЕрдЪреНрдЫрд╛ рдкрд░рд┐рдгрд╛рдо рд╣реИред

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

рдЪрд┐рддреНрд░ рд╕рдВрдЦреНрдпрд╛ 2 рдХреЛ рджреЗрдЦрдирд╛ рджрд┐рд▓рдЪрд╕реНрдк рд╣реЛрдЧрд╛ред рдЬреИрд╕рд╛ рдХрд┐ рд╣рдо рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВ, рд╕рдмрд╕реЗ "рдорд╣рдВрдЧрд╛" рдСрдкрд░реЗрд╢рди java.io.File.isDirectory () рд╣реИ, рдЗрд╕рдореЗрдВ рдХреБрд▓ рд╕рдордп рдХрд╛ рд▓рдЧрднрдЧ 46% рд▓рдЧрддрд╛ рд╣реИред рдЗрд╕ рд╕рдорд╕реНрдпрд╛ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ, рдореБрдЭреЗ рдЬрд╛рд╡рд╛ 7, рдЕрдЪреНрдЫреА рддрд░рд╣ рд╕реЗ рдпрд╛ рдирд┐рд░реНрднрд░рддрд╛ рдУрдПрд╕ рд╕реБрд╡рд┐рдзрд╛рдУрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреА рдХреНрд╖рдорддрд╛ рдХреЗ рдЕрд▓рд╛рд╡рд╛ рдХреБрдЫ рднреА рдирд╣реАрдВ рдорд┐рд▓рд╛ред рдЗрд╕рд▓рд┐рдП, рдЗрд╕ рднрд╛рдЧ рдХреЛ рдЕрдиреБрдХреВрд▓рд┐рдд рдХрд░рдиреЗ рдХреА рдХреНрд╖рдорддрд╛ рдЬреИрд╕рд╛ рдХрд┐ рдореИрдВ рджреЗрдЦ рд░рд╣рд╛ рд╣реВрдВ рдпрд╣ рдЕрдзрд┐рдХ рдирд╣реАрдВ рд╣реИред рдЗрд╕рдХреЗ рдмрд╛рдж рдкрд╛рд░реНрд╕рд░ рдЖрддрд╛ рд╣реИ - java.util.regex.Matcher.find (), рд▓реЗрдХрд┐рди рдпрд╣рд╛рдВ рдЖрдк рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдЗрд╕реЗ рдЧрддрд┐ рджреЗ рд╕рдХрддреЗ рд╣реИрдВред рдЖрдк рдПрдХ рдФрд░ рдХрд╛рд░реНрдп рдмрдирд╛ рд╕рдХрддреЗ рд╣реИрдВ рдЬреЛ рдХреЗрд╡рд▓ рдкрд╛рд░реНрд╕рд┐рдВрдЧ рд╕реЗ рдирд┐рдкрдЯреЗрдЧрд╛ред рдпрд╛рдиреА рд╣рдо рджреЛ рд╕рдмрд╕реЗ рдХрдард┐рди рдХрд╛рд░реНрдпреЛрдВ рдХреЛ рдЕрд▓рдЧ рдХрд░реЗрдВрдЧреЗ:
1) рдлрд╝рд╛рдЗрд▓ рд╕рд┐рд╕реНрдЯрдо рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рддреЗ рд╣реИрдВ
2) рдирд╛рдо рдкрд╛рд░реНрд╕рд┐рдВрдЧ
рддреАрд╕рд░рд╛ рдСрдкрд░реЗрд╢рди рдлрд┐рд░ рд╕реЗ IO рд╣реИ, рдФрд░ рдЗрд╕реЗ рдЧрддрд┐ рджреЗрдирд╛ рднреА рдореБрд╢реНрдХрд┐рд▓ рд╣реИред

рдЗрд╕рд▓рд┐рдП, рд╣рдо рдкрд╣рд▓реЗ рдХрд╛рд░реНрдп рдХреЛ рдереЛрдбрд╝рд╛ рд╕рдВрд╢реЛрдзрд┐рдд рдХрд░рддреЗ рд╣реИрдВ рдФрд░ рдПрдХ рдирдпрд╛ рдЬреЛрдбрд╝рддреЗ рд╣реИрдВ:
  import java.io.File; import java.util.ArrayList; import java.util.List; public class WalkinTask implements BacklogTask { private List<File> dirs; private ParseHandler parseHandler; public WalkinTask(List<File> dirs, ParseHandler parseHandler) { this.parseHandler = parseHandler; //this.parseHandler.taskStart(); this.parseHandler.taskStartUnblock(); this.dirs = dirs; } @Override public void run() { try { List<String> filePaths = new ArrayList<String>(); List<File> dirPaths = new ArrayList<File>(); for (File dir : dirs) { if (!dirPaths.isEmpty()) { dirPaths = new ArrayList<File>(); } if (!filePaths.isEmpty()) { filePaths = new ArrayList<String>(); } File listFile[] = dir.listFiles(); if (listFile != null) { for (File file : listFile) { if (file.isDirectory()) { dirPaths.add(file); } else { filePaths.add(file.getPath()); } } } if (!dirPaths.isEmpty()) { parseHandler.schedule(TaskFactory.createWalkingTask(parseHandler, dirPaths)); } if (!filePaths.isEmpty()) { parseHandler.schedule(TaskFactory.createParseTask(parseHandler, filePaths)); } } } finally { //parseHandler.taskFinish(); parseHandler.taskFinishUnblock(); } } @Override public int getTaskType() { return 1; //TODO } } 

 import java.util.ArrayList; import java.util.List; import java.util.regex.Matcher; import java.util.regex.Pattern; public class ParseTask implements BacklogTask { private ParseHandler handler; private List<String> paths; public ParseTask(ParseHandler hander, List<String> paths) { this.handler = hander; this.paths = paths; handler.taskStartUnblock(); } @Override public void run() { try { Pattern pattern = handler.getPattern(); List<String> result = new ArrayList<String>(); for (String path : paths) { Matcher matcher = pattern.matcher(path); while (matcher.find()) { String str = matcher.group(); if (!"".equals(str)) { result.add(str); } } } handler.taskComplete(result); } finally { handler.taskFinishUnblock(); } } @Override public int getTaskType() { return 0; } } 


рдФрд░ рдлрд┐рд░ рд╕реЗ рджреМрдбрд╝реЗрдВ:
рдХреБрд▓ рдХрд╛рд░реНрдп: 221560
52328


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

рдЕрдм рд╣рдореЗрдВ рдпрд╣ рд╕реЛрдЪрдиреЗ рдХреА рдЬрд╝рд░реВрд░рдд рд╣реИ рдХрд┐ рдХрд╛рд░реНрдпрдХреНрд░рдо рд╕реЗ рдмрд╛рд╣рд░ рдХреИрд╕реЗ рдирд┐рдХрд▓реЗрдВ, рдФрд░ рдкрд░рд┐рдгрд╛рдо рдХреИрд╕реЗ рд▓реМрдЯрд╛рдПрдВред рд╣рдордиреЗ рдХрд╛рд░реНрдпреЛрдВ рдХрд╛ рдПрдХ рд╕рдореВрд╣ рдмрдирд╛рдпрд╛ рд╣реИ, рдФрд░ рд╣рдо рдирд╣реАрдВ рдЬрд╛рдирддреЗ рдХрд┐ рд╡реЗ рдХрдм рдкреВрд░реЗ рд╣реЛрдВрдЧреЗред рдореИрдВ рдХрд╛рд░реНрдпреЛрдВ рдХреА рдХреБрд▓ рд╕рдВрдЦреНрдпрд╛ рдХреА рдЧрдгрдирд╛ рд╕реЗ рдмреЗрд╣рддрд░ рдХреБрдЫ рднреА рдирд╣реАрдВ рдЖрдпрд╛, рдФрд░ рдХрд╛рдЙрдВрдЯрд░ рд╢реВрдиреНрдп рд╣реЛрдиреЗ рддрдХ рдкреНрд░рддреАрдХреНрд╖рд╛ рдХрд░реЗрдВред рдЗрд╕рдХреЗ рд▓рд┐рдП рд╣рдореЗрдВ рдПрдХ рд╡реИрд░рд┐рдПрдмрд▓ рдЪрд╛рд╣рд┐рдП рдЬрд┐рд╕рдореЗрдВ рд╣рдо рд╡реИрд▓реНрдпреВрдЬ рдХреЛ рд╕рдВрдЪрд┐рдд рдХрд░реЗрдВрдЧреЗред рд▓реЗрдХрд┐рди рдпрд╣рд╛рдБ рднреА, рдЗрддрдирд╛ рдЖрд╕рд╛рди рдирд╣реАрдВ рд╣реИред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдпрджрд┐ рд╣рдо рдПрдХ рдирд┐рдпрдорд┐рдд рдЪрд░ рд▓реЗрддреЗ рд╣реИрдВ рдФрд░ рдХрд╛рд░реНрдп рдмрдирдиреЗ рдкрд░ рдЗрд╕реЗ рдмрдврд╝рд╛рддреЗ рд╣реИрдВ, рдФрд░ рдХрд╛рд░реНрдп рд╕рдорд╛рдкреНрдд рд╣реЛрдиреЗ рдкрд░ рдЗрд╕реЗ рдШрдЯрд╛рддреЗ рд╣реИрдВред рд▓реЗрдХрд┐рди рдЗрд╕ рджреГрд╖реНрдЯрд┐рдХреЛрдг рдХреЗ рд╕рд╛рде, рдкрд░рд┐рдгрд╛рдо рд╡рд┐рдирд╛рд╢рдХрд╛рд░реА рд╣реЛрдЧрд╛, рдХреНрдпреЛрдВрдХрд┐ рдЬрд╛рд╡рд╛ рдореЗрдВ, i ++ рдСрдкрд░реЗрд╢рди рдкрд░рдорд╛рдгреБ рдирд╣реАрдВ рд╣реИ, рднрд▓реЗ рд╣реА рд╣рдо рдкреНрд░рддрд┐рд╖реНрдард┐рдд рд╡рд╛рд╖реНрдкрд╢реАрд▓ рд╕рдВрд╢реЛрдзрдХ рдХреА рдЖрдкреВрд░реНрддрд┐ рдХрд░рддреЗ рд╣реИрдВред рдпрд╣ AtomicIteger рд▓реЗрдиреЗ рдХреЗ рд▓рд┐рдП рдЖрджрд░реНрд╢ рд╣реЛрдЧрд╛, рд▓реЗрдХрд┐рди рд╢рд░реНрдд рдХреЗ рдЕрдиреБрд╕рд╛рд░ рд╣рдо use.concurrent рдкреИрдХреЗрдЬ рдХрд╛ рдЙрдкрдпреЛрдЧ рдирд╣реАрдВ рдХрд░ рд╕рдХрддреЗред рдЗрд╕рд▓рд┐рдП, рд╣рдореЗрдВ рдЕрдкрдирд╛ рдкрд░рдорд╛рдгреБ рдмрдирд╛рдирд╛ рд╣реЛрдЧрд╛ред рдпрджрд┐ рдЖрдк рдЗрд╕ рдмрд╛рдд рдкрд░ рдзреНрдпрд╛рди рдХреЗрдВрджреНрд░рд┐рдд рдХрд░рддреЗ рд╣реИрдВ рдХрд┐ рдкрд░рдорд╛рдгреБ рдЬрд╛рд╡рд╛ рдореЗрдВ рдХреИрд╕реЗ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ, рддреЛ рд╣рдо рдПрдХ рджреЗрд╢реА рдкрджреНрдзрддрд┐ рдореЗрдВ рдЖрддреЗ рд╣реИрдВред рдПрдХ рдЪрд░ рдкрд░рд┐рд╡рд░реНрддрди рдХреА рдкрд░рдорд╛рдгреБ рдкреНрд░рдХреГрддрд┐ рдХреЛ рдПрдХ рдкреНрд░реЛрд╕реЗрд╕рд░ рдХрдорд╛рдВрдб рдХреЗ рд░реВрдк рдореЗрдВ рд▓рд╛рдЧреВ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдЬрд╛рд╡рд╛ рджреЗрд╢реА рдУрдПрд╕ рдХрдорд╛рдВрдб рдХреЛ рдХреЙрд▓ рдХрд░рддрд╛ рд╣реИ, рдЬреЛ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдкреНрд░реЛрд╕реЗрд╕рд░ рдХрдорд╛рдВрдб рдХреЛ рдХреЙрд▓ рдХрд░рддрд╛ рд╣реИред
рдЕрд╕рд▓ рдореЗрдВ, рд╣рдо рдирд┐рдпрдорд┐рдд рд╕рд┐рдВрдХреНрд░рдирд╛рдЗрдЬрд╝ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рд▓реЗрдХрд┐рди рдмрдбрд╝реА рд╕рдВрдЦреНрдпрд╛ рдореЗрдВ рдХрд╛рд░реНрдпреЛрдВ рдХреЗ рд╕рд╛рде, рд▓реЙрдХ рд░реЗрд╕ рд╢реБрд░реВ рд╣реЛ рдЬрд╛рдПрдЧреА, рдФрд░ рдЙрддреНрдкрд╛рджрдХрддрд╛ рдШрдЯ рдЬрд╛рдПрдЧреА (рд╣рд╛рд▓рд╛рдВрдХрд┐ рдорд╣рддреНрд╡рдкреВрд░реНрдг рдирд╣реАрдВ)ред рдпрд╣рд╛рдБ рдПрдХ рдирдореВрдирд╛ рдХреЛрдб рд╣реИ рдЬреЛ CAS рдПрд▓реНрдЧреЛрд░рд┐рдереНрдо рдХреЛ рд▓рд╛рдЧреВ рдХрд░рддрд╛ рд╣реИ (рдХреЛрдб ibm рд╡реЗрдмрд╕рд╛рдЗрдЯ рдкрд░ рдкрд╛рдпрд╛ рдЧрдпрд╛ рдерд╛):
  public class SimulatedCAS { private volatile int value; public synchronized int getValue() { return value; } public synchronized int compareAndSwap(int expectedValue, int newValue) { int oldValue = value; if (value == expectedValue) value = newValue; return oldValue; } } 

  public class CasCounter { private SimulatedCAS value = new SimulatedCAS(); public int getValue() { return value.getValue(); } public int increment() { int oldValue = value.getValue(); while (value.compareAndSwap(oldValue, oldValue + 1) != oldValue) oldValue = value.getValue(); return oldValue + 1; } public int decrement() { int oldValue = value.getValue(); while (value.compareAndSwap(oldValue, oldValue - 1) != oldValue) oldValue = value.getValue(); return oldValue - 1; } } 


рдмрд╕ рдЗрддрдирд╛ рд╣реАред
рд╕реНрд░реЛрдд рдХреЗ рд╕рд╛рде рдкреБрд░рд╛рд▓реЗрдЦ: рд▓рд┐рдВрдХ

PS рдореИрдВрдиреЗ рдЗрд╕реЗ рд▓рд┐рдирдХреНрд╕ рдкрд░, рдФрд░ рд╡рд┐рдВрдбреЛрдЬ рдкрд░ 4-рдХреЛрд░ рдкреНрд░реЛрд╕реЗрд╕рд░ рдкрд░ рдкрд░реАрдХреНрд╖рдг рдХрд┐рдпрд╛ред рдкреВрд▓ рдореЗрдВ рдзрд╛рдЧреЗ рдХреА рдЗрд╖реНрдЯрддрдо рд╕рдВрдЦреНрдпрд╛ рдХреА рдЧрдгрдирд╛ рдкреНрд░рдпреЛрдЧрд╛рддреНрдордХ рд░реВрдк рд╕реЗ рдХреА рдЧрдИ рдереА - 16, рдЕрд░реНрдерд╛рддреНред рдХреЛрд░ рдХреА рд╕рдВрдЦреНрдпрд╛ * 4, рдПрдХ рдмрд╛рд░ рдЗрдВрдЯрд░рдиреЗрдЯ рдкрд░ рдЗрд╕ рддрд░рд╣ рдХрд╛ рдПрдХ рд╕реВрддреНрд░ рдкрд╛рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдореБрдЭреЗ рдпрд╛рдж рдирд╣реАрдВ рд╣реИ рдХрд┐ рдХрд╣рд╛рдВ рд╣реИред рд╡рд┐рдВрдбреЛрдЬ рдореЗрдВ рдПрдХ рд╕реБрд╡рд┐рдзрд╛ рд╣реИ, рдЬрдм рдЖрдк рдЗрд╕реЗ рдкрд╣рд▓реА рдмрд╛рд░ рд╢реБрд░реВ рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рд╕рдм рдХреБрдЫ рдмрд╣реБрдд рд▓рдВрдмреЗ рд╕рдордп рддрдХ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ, рдФрд░ рдЕрдХреНрд╕рд░ рд╕рдм рдХреБрдЫ рдЖрдИрдУ рдкрд░ рд▓рдЯрдХрд╛ рд╣реЛрддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рджреВрд╕рд░реА рд╢реБрд░реБрдЖрдд рдореЗрдВ рд╕рдм рдХреБрдЫ рдмрд╣реБрдд рддреЗрдЬреА рд╕реЗ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ, рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рдлрд╝рд╛рдЗрд▓ рд╕рд┐рд╕реНрдЯрдо рдХреЛ рдХреИрд╢ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдУрдПрд╕ рдХреА рдПрдХ рд╡рд┐рд╢реЗрд╖рддрд╛ рд╣реИред рдореИрдВрдиреЗ рджреВрд╕рд░реЗ рд▓реЙрдиреНрдЪ рдХреЗ рд╕рд╛рде рдФрд░ рдЙрд╕рдХреЗ рдмрд╛рдж рд╕рдм рдХреБрдЫ рдХрд╛ рдкрд░реАрдХреНрд╖рдг рдХрд┐рдпрд╛, рдлрд┐рд░ рдореИрдВрдиреЗ рдкреНрд░реЛрдлрд╛рдЗрд▓рд░ рдореЗрдВ рд╕реАрдкреАрдпреВ рдХреЗ рдЙрдкрдпреЛрдЧ рдХреЛ рджреЗрдЦрд╛, рдЕрдЧрд░ рдХрд╣реАрдВ рд╕реАрдкреАрдпреВ рдХреА рд╡рд┐рдлрд▓рддрд╛ рдереА, рддреЛ рдореИрдВрдиреЗ рдЗрд╕ рдкрд░реАрдХреНрд╖рдг рдХреЛ рдЧрд▓рдд рдорд╛рдирд╛ рдФрд░ рдЖрдВрдХрдбрд╝реЛрдВ рдореЗрдВ рдЗрд╕ рдкрд░реАрдХреНрд╖рдг рдХрд╛ рдЙрдкрдпреЛрдЧ рдирд╣реАрдВ рдХрд┐рдпрд╛ред рдореИрдВрдиреЗ рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдлрд╝реЛрд▓реНрдбрд░ (CVS рдлрд╝рд╛рдЗрд▓реЛрдВ рдХреЗ рд╕рд╛рде рдХрдИ рдмрдбрд╝реА рдкрд░рд┐рдпреЛрдЬрдирд╛рдУрдВ) рдкрд░ рд╕рдм рдХреБрдЫ рдкрд░реАрдХреНрд╖рдг рдХрд┐рдпрд╛ред

PSS рдпрд╣ рд╣рдм рдкрд░ рдореЗрд░рд╛ рдкрд╣рд▓рд╛ рдмрдбрд╝рд╛ рд╡рд┐рд╖рдп рд╣реИ, рдЗрд╕рд▓рд┐рдП рдХреГрдкрдпрд╛ рдбрд┐рдЬрд╛рдЗрди рдкрд░ рдЬреНрдпрд╛рджрд╛ рдЖрд▓реЛрдЪрдирд╛ рди рдХрд░реЗрдВ, рдпрджрд┐ рд╕рдВрднрд╡ рд╣реЛ рддреЛ рдореИрдВ рдЗрд╕реЗ рд╕рд╣реА рдХрд░реВрдВрдЧрд╛ред

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


All Articles