html
Java рдореЗрдВ ThreadPool рдХреЗ рд╕рд╛рде рдорд▓реНрдЯреАрдереНрд░реЗрдбрд┐рдВрдЧ рдХрд╛ рдЕрдиреБрдХреВрд▓рди: рдПрдХ рд╡реНрдпрд╛рдкрдХ рдорд╛рд░реНрдЧрджрд░реНрд╢рд┐рдХрд╛
рд╡рд┐рд╖рдп рд╕реВрдЪреА
- рдкрд░рд┐рдЪрдп .......................................... 1
- Java рдореЗрдВ рдереНрд░реЗрдбреНрд╕ рдХреЛ рд╕рдордЭрдирд╛ ........ 3
- рдХрдИ рдереНрд░реЗрдбреНрд╕ рдХрд╛ рдкреНрд░рдмрдВрдзрди рдХрд░рдиреЗ рдХреА рдЪреБрдиреМрддреА ... 6
- ThreadPool рдХрд╛ рдкрд░рд┐рдЪрдп .................... 10
- ExecutorService рдХреЗ рд╕рд╛рде ThreadPool рд▓рд╛рдЧреВ рдХрд░рдирд╛ ... 14
- рдкреНрд░рд╛рдпреЛрдЧрд┐рдХ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди ............. 18
- рд╕рд░реНрд╡реЛрддреНрддрдо рдкреНрд░рдерд╛рдПрдБ рдФрд░ рдЕрдиреБрдХреВрд▓рди .. 22
- рдирд┐рд╖реНрдХрд░реНрд╖ ............................................. 26
- рдЕрддрд┐рд░рд┐рдХреНрдд рд╕рдВрд╕рд╛рдзрди ......................... 28
рдкрд░рд┐рдЪрдп
рд╕реЙрдлреНрдЯрд╡реЗрдпрд░ рд╡рд┐рдХрд╛рд╕ рдХреЗ рд▓рдЧрд╛рддрд╛рд░ рдмрджрд▓рддреЗ рдкрд░рд┐рджреГрд╢реНрдп рдореЗрдВ, рдХреБрд╢рд▓ thread рдкреНрд░рдмрдВрдзрди рдЙрдЪреНрдЪ-рдкреНрд░рджрд░реНрд╢рди, рд╕реНрдХреЗрд▓реЗрдмрд▓ рдЕрдиреБрдкреНрд░рдпреЛрдЧреЛрдВ рдХреЗ рдирд┐рд░реНрдорд╛рдг рдХреЗ рд▓рд┐рдП рдЖрд╡рд╢реНрдпрдХ рд╣реИред Multithreading рдкреНрд░реЛрдЧреНрд░рд╛рдореЛрдВ рдХреЛ рдПрдХ рд╕рд╛рде рдХрдИ рд╕рдВрдЪрд╛рд▓рди рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИ, рдЬрд┐рд╕рд╕реЗ responsiveness рдФрд░ resource utilization рдореЗрдВ рд╕реБрдзрд╛рд░ рд╣реЛрддрд╛ рд╣реИред рд╣рд╛рд▓рд╛рдВрдХрд┐, рдХрдИ threads рдХрд╛ рдкреНрд░рдмрдВрдзрди рдЬрдЯрд┐рд▓рддрд╛рдПрдВ рдЙрддреНрдкрдиреНрди рдХрд░ рд╕рдХрддрд╛ рд╣реИ, рдЬреИрд╕реЗ increased overhead рдФрд░ рд╕рдВрднрд╛рд╡рд┐рдд performance bottlenecksред
рдпрд╣ eBook Java рдореЗрдВ ThreadPool рдХреА рдЕрд╡рдзрд╛рд░рдгрд╛ рдореЗрдВ рдЧрд╣рд░рд╛рдИ рд╕реЗ рдЬрд╛рддрд╛ рд╣реИ, рдЗрд╕рдХреЗ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдФрд░ рд▓рд╛рднреЛрдВ рдХреА рд╡реНрдпрд╛рдкрдХ рдЦреЛрдЬ рдкреНрд░рджрд╛рди рдХрд░рддрд╛ рд╣реИред рдЪрд╛рд╣реЗ рдЖрдк рдореВрд▓ рдмрд╛рддреЗрдВ grasp рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рд╢реБрд░реБрдЖрддрдХрд░реНрддрд╛ рд╣реЛрдВ рдпрд╛ optimization рддрдХрдиреАрдХреЛрдВ рдХреА рддрд▓рд╛рд╢ рдореЗрдВ рдПрдХ рдбреЗрд╡рд▓рдкрд░, рдпрд╣ рдорд╛рд░реНрдЧрджрд░реНрд╢рд┐рдХрд╛ рдЖрдкрдХреЗ multithreaded рдЕрдиреБрдкреНрд░рдпреЛрдЧреЛрдВ рдХреЛ рдмрдврд╝рд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдореВрд▓реНрдпрд╡рд╛рди рдЕрдВрддрд░реНрджреГрд╖реНрдЯрд┐ рдкреНрд░рджрд╛рди рдХрд░рддреА рд╣реИред
ThreadPool рдХрд╛ рдорд╣рддреНрд╡
- Efficiency: рдмрд╛рд░-рдмрд╛рд░ threads рдмрдирд╛рдиреЗ рдФрд░ рдирд╖реНрдЯ рдХрд░рдиреЗ рдХреЗ overhead рдХреЛ рдХрдо рдХрд░рддрд╛ рд╣реИред
- Resource Management: рд╕рдХреНрд░рд┐рдп threads рдХреА рд╕рдВрдЦреНрдпрд╛ рдХреЛ рдирд┐рдпрдВрддреНрд░рд┐рдд рдХрд░рддрд╛ рд╣реИ, рдЬрд┐рд╕рд╕реЗ resource exhaustion рд╕реЗ рдмрдЪрд╛рд╡ рд╣реЛрддрд╛ рд╣реИред
- Performance: рдХрдИ рдХрд╛рд░реНрдпреЛрдВ рдХреЗ рд▓рд┐рдП threads рдХреЛ рдкреБрди: рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ application рдХреЗ рдкреНрд░рджрд░реНрд╢рди рдХреЛ рдЕрдиреБрдХреВрд▓рд┐рдд рдХрд░рддрд╛ рд╣реИред
Pros and Cons
Pros | Cons |
---|---|
рдкреБрди: рдЙрдкрдпреЛрдЧ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдкреНрд░рджрд░реНрд╢рди рдореЗрдВ рд╕реБрдзрд╛рд░ | рдкреНрд░рдмрдВрдзрди рдореЗрдВ рдЬрдЯрд┐рд▓рддрд╛ рдкреИрджрд╛ рдХрд░ рд╕рдХрддрд╛ рд╣реИ |
рд╕рдХреНрд░рд┐рдп threads рдХреА рд╕рдВрдЦреНрдпрд╛ рдХреЛ рдирд┐рдпрдВрддреНрд░рд┐рдд рдХрд░рддрд╛ рд╣реИ | Thread starvation рдХреА рд╕рдВрднрд╛рд╡рдирд╛ |
рд╕рд┐рд╕реНрдЯрдо рд╕рдВрд╕рд╛рдзрдиреЛрдВ рдХреА рдЦрдкрдд рдХреЛ рдХрдо рдХрд░рддрд╛ рд╣реИ | рд╕рд╛рд╡рдзрд╛рдиреАрдкреВрд░реНрд╡рдХ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ |
ThreadPool рдХрдм рдФрд░ рдХрд╣рд╛рдБ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВ
- High-Concurrency Environments: рд╡реЗ рдЕрдиреБрдкреНрд░рдпреЛрдЧ рдЬреЛ рдХрдИ рдПрдХ рд╕рд╛рде рдХрд╛рд░реНрдпреЛрдВ рдХреЛ рд╕рдВрднрд╛рд▓рддреЗ рд╣реИрдВред
- Server Applications: рд╡реЗрдм рд╕рд░реНрд╡рд░реНрд╕ рдЬреЛ рдХрдИ рдХреНрд▓рд╛рдЗрдВрдЯ рдЕрдиреБрд░реЛрдзреЛрдВ рдХреЛ рдкреНрд░рдмрдВрдзрд┐рдд рдХрд░рддреЗ рд╣реИрдВред
- Background Processing: рдРрд╕реЗ рдХрд╛рд░реНрдп рдЬреЛ рдмрд┐рдирд╛ рддрддреНрдХрд╛рд▓ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдЗрдВрдЯрд░реИрдХреНрд╢рди рдХреЗ рд╕реНрд╡рддрдВрддреНрд░ рд░реВрдк рд╕реЗ рдЪрд▓ рд╕рдХрддреЗ рд╣реИрдВред
Java рдореЗрдВ рдереНрд░реЗрдбреНрд╕ рдХреЛ рд╕рдордЭрдирд╛
рдереНрд░реЗрдб рдХреНрдпрд╛ рд╣реИ?
рдПрдХ thread рд╕рдмрд╕реЗ рдЫреЛрдЯреА рдкреНрд░реЛрд╕реЗрд╕рд┐рдВрдЧ рдпреВрдирд┐рдЯ рд╣реИ рдЬрд┐рд╕реЗ Java Virtual Machine (JVM) рджреНрд╡рд╛рд░рд╛ рдкреНрд░рдмрдВрдзрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рдкреНрд░рддреНрдпреЗрдХ thread рд╕реНрд╡рддрдВрддреНрд░ рд░реВрдк рд╕реЗ рдЪрд▓рддрд╛ рд╣реИ, рдЬрд┐рд╕рд╕реЗ рдкреНрд░реЛрдЧреНрд░рд╛рдо рдХреЗ рднреАрддрд░ рдХреЛрдб рд╕реЗрдЧрдореЗрдВрдЯреНрд╕ рдХрд╛ рд╕рдорд╛рдирд╛рдВрддрд░ рдирд┐рд╖реНрдкрд╛рджрди рд╕рдВрднрд╡ рд╣реЛрддрд╛ рд╣реИред
Threads рдмрдирд╛рдирд╛
Java рдореЗрдВ рдереНрд░реЗрдбреНрд╕ рдмрдирд╛рдиреЗ рдХреЗ рддрд░реАрдХреЗ:
- Thread рд╡рд░реНрдЧ рдХрд╛ рд╡рд┐рд╕реНрддрд╛рд░ рдХрд░рдирд╛:
12345678910111213141516171819202122232425262728class SomeThread extends Thread {private String name;public SomeThread(String name) {super(name);this.name = name;}@Overridepublic void run() {System.out.println("Started thread " + name);try {Thread.sleep(3000);} catch (InterruptedException e) {e.printStackTrace();}System.out.println("Ended thread " + name);}}public class Main {public static void main(String[] args) {SomeThread thread = new SomeThread("Thread-1");thread.start();}}Output:
123Started thread Thread-1(After 3 seconds)Ended thread Thread-1 - Runnable рдЗрдВрдЯрд░рдлреЗрд╕ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдирд╛:
123456789101112131415161718192021222324252627class SomeRunnable implements Runnable {private String name;public SomeRunnable(String name) {this.name = name;}@Overridepublic void run() {System.out.println("Started runnable " + name);try {Thread.sleep(3000);} catch (InterruptedException e) {e.printStackTrace();}System.out.println("Ended runnable " + name);}}public class Main {public static void main(String[] args) {Thread thread = new Thread(new SomeRunnable("Runnable-1"));thread.start();}}
Output:
123Started runnable Runnable-1(After 3 seconds)Ended runnable Runnable-1
рдореБрдЦреНрдп рдЕрд╡рдзрд╛рд░рдгрд╛рдПрдБ рдФрд░ рд╢рдмреНрджрд╛рд╡рд▓реА
- Concurrency: рдПрдХ рд╕рд╛рде рдХрдИ threads рдХрд╛ рдирд┐рд╖реНрдкрд╛рджрди рдХрд░рдиреЗ рдХреА рдХреНрд╖рдорддрд╛ред
- Synchronization: рд╕рд╛рдЭрд╛ рд╕рдВрд╕рд╛рдзрдиреЛрдВ рддрдХ рдкрд╣реБрдВрдЪрдиреЗ рдХреЗ рджреМрд░рд╛рди ьЧмыЯм threads рдХреЗ рдмреАрдЪ рд╣рд╕реНрддрдХреНрд╖реЗрдк рдХреЛ рд░реЛрдХрдирд╛ред
- Deadlock: рдПрдХ рд╕реНрдерд┐рддрд┐ рдЬрд╣рд╛рдВ рджреЛ рдпрд╛ рдЕрдзрд┐рдХ threads рд╣рдореЗрд╢рд╛ рдХреЗ рд▓рд┐рдП рдПрдХ-рджреВрд╕рд░реЗ рдХрд╛ рдЗрдВрддрдЬрд╛рд░ рдХрд░рддреЗ рд░рд╣рддреЗ рд╣реИрдВред
рдХрдИ рдереНрд░реЗрдбреНрд╕ рдХрд╛ рдкреНрд░рдмрдВрдзрди рдХрд░рдиреЗ рдХреА рдЪреБрдиреМрддреА
рдЬрдмрдХрд┐ multithreading рдЕрдиреБрдкреНрд░рдпреЛрдЧ рдХреЗ рдкреНрд░рджрд░реНрд╢рди рдореЗрдВ рдХрд╛рдлреА рд╕реБрдзрд╛рд░ рдХрд░ рд╕рдХрддрд╛ рд╣реИ, рдпрд╣ рдХрдИ рдереНрд░реЗрдбреНрд╕ рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░рддреЗ рд╕рдордп рдЪреБрдиреМрддрд┐рдпрд╛рдБ рднреА рдкреНрд░рд╕реНрддреБрдд рдХрд░рддрд╛ рд╣реИ, рд╡рд┐рд╢реЗрд╖рдХрд░ рдмрдбрд╝реА рд╕рдВрдЦреНрдпрд╛ рдореЗрдВ threads рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рддреЗ рд╕рдордп:
рдЕрддрд┐рд░рд┐рдХреНрдд Threads рдХреЗ рдореБрджреНрджреЗ
- Resource Consumption: рдкреНрд░рддреНрдпреЗрдХ thread рд╕рд┐рд╕реНрдЯрдо рд╕рдВрд╕рд╛рдзрдиреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИред рдмрд╣реБрдд рдЬреНрдпрд╛рджрд╛ threads рдмрдирд╛рдиреЗ рд╕реЗ resource exhaustion рд╣реЛ рд╕рдХрддрд╛ рд╣реИред
- Context Switching: CPU рдХреЛ threads рдХреЗ рдмреАрдЪ рд╕реНрд╡рд┐рдЪ рдХрд░рдиреЗ рдореЗрдВ рд╕рдордп рд▓рдЧрддрд╛ рд╣реИ, рдЬреЛ рдкреНрд░рджрд░реНрд╢рди рдХреЛ рдШрдЯрд╛ рд╕рдХрддрд╛ рд╣реИред
- Complexity: рдХрдИ threads рдХреЗ рдЬреАрд╡рдирдЪрдХреНрд░ рдФрд░ synchronization рдХрд╛ рдкреНрд░рдмрдВрдзрди рдХреЛрдб рдХреА рдЬрдЯрд┐рд▓рддрд╛ рдмрдврд╝рд╛рддрд╛ рд╣реИред
рд╡рд╛рд╕реНрддрд╡рд┐рдХ рджреБрдирд┐рдпрд╛ рдХрд╛ рдкрд░рд┐рджреГрд╢реНрдп
рдХрд▓реНрдкрдирд╛ рдХрд░реЗрдВ рдХрд┐ рдПрдХ рдЕрдиреБрдкреНрд░рдпреЛрдЧ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдЕрдиреБрд░реЛрдзреЛрдВ рдХреЛ рд╕рдВрднрд╛рд▓рдиреЗ рдХреЗ рд▓рд┐рдП 1,000 threads рдЙрддреНрдкрдиреНрди рдХрд░рддрд╛ рд╣реИред рд╕реАрдорд┐рдд рдкреНрд░реЛрд╕реЗрд╕рд┐рдВрдЧ рд╢рдХреНрддрд┐ рд╡рд╛рд▓реЗ рд╕рд┐рд╕реНрдЯрдореЛрдВ рдкрд░, рдЗрд╕рд╕реЗ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рд╣реЛ рд╕рдХрддреЗ рд╣реИрдВ:
- Reduced Performance: CPU рд╕рднреА threads рдХреЛ рдХреБрд╢рд▓рддрд╛рдкреВрд░реНрд╡рдХ рдкреНрд░рдмрдВрдзрд┐рдд рдХрд░рдиреЗ рдореЗрдВ рд╕рдВрдШрд░реНрд╖ рдХрд░ рд╕рдХрддрд╛ рд╣реИред
- Increased Latency: thread contention рдХреЗ рдХрд╛рд░рдг рдХрд╛рд░реНрдпреЛрдВ рдХреЛ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд░рдиреЗ рдореЗрдВ рдЕрдзрд┐рдХ рд╕рдордп рд▓рдЧ рд╕рдХрддрд╛ рд╣реИред
- Potential Crashes: рд╕рд┐рд╕реНрдЯрдо рд╕рдВрд╕рд╛рдзрдиреЛрдВ рдХреЗ рд╕рдорд╛рдкреНрдд рд╣реЛрдиреЗ рд╕реЗ рдЕрдиреБрдкреНрд░рдпреЛрдЧ рдХреНрд░реИрд╢ рд╣реЛ рд╕рдХрддрд╛ рд╣реИред
ThreadPool рдХрд╛ рдкрд░рд┐рдЪрдп
рдПрдХ ThreadPool рдПрдХ worker threads рдХреЗ рдкреВрд▓ рдХрд╛ рдкреНрд░рдмрдВрдзрди рдХрд░рддрд╛ рд╣реИ, рдЙрдиреНрд╣реЗрдВ рдХрдИ рдХрд╛рд░реНрдпреЛрдВ рдХреЛ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдкреБрди: рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИред рдпрд╣ рджреГрд╖реНрдЯрд┐рдХреЛрдг рдХрдИ threads рдмрдирд╛рдиреЗ рдХреЗ рдирдХрд╛рд░рд╛рддреНрдордХ рдкрд╣рд▓реБрдУрдВ рдХреЛ рдХрдо рдХрд░рддрд╛ рд╣реИ, рд╕рдХреНрд░рд┐рдп threads рдХреА рд╕рдВрдЦреНрдпрд╛ рдХреЛ рдирд┐рдпрдВрддреНрд░рд┐рдд рдХрд░рдХреЗ рдФрд░ рдореМрдЬреВрджрд╛ threads рдХрд╛ рдкреБрди: рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗред
ThreadPool рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рд▓рд╛рдн
- Resource Optimization: рдПрдХ рд╕рдордп рдореЗрдВ рдЪрд▓рдиреЗ рд╡рд╛рд▓реЗ concurrent threads рдХреА рд╕рдВрдЦреНрдпрд╛ рдХреЛ рд╕реАрдорд┐рдд рдХрд░рддрд╛ рд╣реИ, рдЬрд┐рд╕рд╕реЗ resource exhaustion рдХреЛ рд░реЛрдХрддрд╛ рд╣реИред
- Performance Enhancement: thread рдирд┐рд░реНрдорд╛рдг рдФрд░ рд╡рд┐рдирд╛рд╢ рд╕реЗ рдЬреБрдбрд╝рд╛ overhead рдХрдо рдХрд░рддрд╛ рд╣реИред
- Scalability: рдкреВрд▓ рдХреЗ рдЖрдХрд╛рд░ рдХреЛ рд╕рдорд╛рдпреЛрдЬрд┐рдд рдХрд░рдХреЗ рд╡рд┐рднрд┐рдиреНрди рдХрд╛рд░реНрдпрднрд╛рд░реЛрдВ рдХрд╛ рдЖрд╕рд╛рдиреА рд╕реЗ рдкреНрд░рдмрдВрдзрди рдХрд░рддрд╛ рд╣реИред
рдореБрдЦреНрдп рдШрдЯрдХ
- Worker Threads: рдкреВрд░реНрд╡рдирд┐рд░реНрдорд┐рдд threads рдЬреЛ queue рд╕реЗ рдХрд╛рд░реНрдпреЛрдВ рдХреЛ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд░рддреЗ рд╣реИрдВред
- Task Queue: рдПрдХ queue рдЬреЛ рдЙрди рдХрд╛рд░реНрдпреЛрдВ рдХреЛ рд░рдЦрддреА рд╣реИ рдЬреЛ threads рджреНрд╡рд╛рд░рд╛ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рд╣реЛрдиреЗ рдХреЗ рд▓рд┐рдП рдкреНрд░рддреАрдХреНрд╖рд╛ рдХрд░ рд░рд╣реЗ рд╣реИрдВред
- Executor Service: thread pool рдФрд░ task execution рдХрд╛ рдкреНрд░рдмрдВрдзрди рдХрд░рддрд╛ рд╣реИред
ExecutorService рдХреЗ рд╕рд╛рде ThreadPool рд▓рд╛рдЧреВ рдХрд░рдирд╛
Java рдХрд╛ ExecutorService framework thread pools рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХрд╛ рдПрдХ рдордЬрдмреВрдд рддрд░реАрдХрд╛ рдкреНрд░рджрд╛рди рдХрд░рддрд╛ рд╣реИред рдпрд╣ thread рдкреНрд░рдмрдВрдзрди рдХреЛ abstraction рдХрд░рддрд╛ рд╣реИ, рдЬрд┐рд╕рд╕реЗ рдбреЗрд╡рд▓рдкрд░реНрд╕ рдХреЛ task execution рдкрд░ рдзреНрдпрд╛рди рдХреЗрдВрджреНрд░рд┐рдд рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рдорд┐рд▓рддреА рд╣реИред
ExecutorService рд╕реЗрдЯ рдЕрдк рдХрд░рдирд╛
- Fixed Thread Pool рдмрдирд╛рдирд╛:
123ExecutorService executorService = Executors.newFixedThreadPool(6);- Fixed Thread Pool: рдПрдХ рд╕реНрдерд┐рд░ рд╕рдВрдЦреНрдпрд╛ рд╡рд╛рд▓реЗ threads рдХреЗ рд╕рд╛рде рдкреВрд▓ред рдРрд╕реЗ рдкрд░рд┐рджреГрд╢реНрдп рдХреЗ рд▓рд┐рдП рдЙрдкрдпреБрдХреНрдд рдЬрд╣рд╛рдБ рдХрд╛рд░реНрдпрднрд╛рд░ рд╕реБрд╕рдВрдЧрдд рд╣реЛрддрд╛ рд╣реИред
- Tasks рдЬрдорд╛ рдХрд░рдирд╛:
12345for (int i = 1; i <= 12; i++) {executorService.execute(new SomeRunnable("Runnable-" + i));}- execute() Method: рдкрд░рд┐рдгрд╛рдо рдХреА рдЙрдореНрдореАрдж рдХрд┐рдП рдмрд┐рдирд╛ task рдХреЛ рдирд┐рд╖реНрдкрд╛рджрди рдХреЗ рд▓рд┐рдП рдЬрдорд╛ рдХрд░рддрд╛ рд╣реИред
- ExecutorService рдХреЛ рдмрдВрдж рдХрд░рдирд╛:
123executorService.shutdown();- рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░рддрд╛ рд╣реИ рдХрд┐ рд╕рднреА рдЬрдорд╛ рдХрд┐рдП рдЧрдП tasks рдкреВрд░реЗ рд╣реЛрдиреЗ рдХреЗ рдмрд╛рдж рдмрдВрдж рд╣реЛред
рдкреНрд░рд╡рд╛рд╣ рдХреЛ рд╕рдордЭрдирд╛
- Task Submission: Tasks рдХреЛ executor service рдХреА queue рдореЗрдВ рдЬрдорд╛ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред
- Thread Allocation: Worker threads queue рд╕реЗ tasks рдЙрдард╛рддреЗ рд╣реИрдВ рдФрд░ рдЙрдиреНрд╣реЗрдВ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд░рддреЗ рд╣реИрдВред
- Completion: рдХрд╛рд░реНрдпреЛрдВ рдХреЗ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рд╣реЛрдиреЗ рдХреЗ рдмрд╛рдж, threads рдирдП tasks рдХреЗ рд▓рд┐рдП рдЙрдкрд▓рдмреНрдз рд╣реЛ рдЬрд╛рддреЗ рд╣реИрдВред
рдкреНрд░рд╛рдпреЛрдЧрд┐рдХ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди
рдЖрдЗрдП рдПрдХ рдкреНрд░рд╛рдпреЛрдЧрд┐рдХ рдЙрджрд╛рд╣рд░рдг рджреЗрдЦреЗрдВ рдЬреЛ ThreadPool
рдХреЛ ExecutorService
рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХрд╛ рдкреНрд░рджрд░реНрд╢рди рдХрд░рддрд╛ рд╣реИред
рд╕реИрдВрдкрд▓ рдХреЛрдб
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 |
import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; class SomeRunnable implements Runnable { private String name; public SomeRunnable(String name) { this.name = name; } @Override public void run() { System.out.println("Started runnable " + name); try { // рдХрд╛рд░реНрдп рдирд┐рд╖реНрдкрд╛рджрди рд╕рдордп рдХрд╛ рдЕрдиреБрдХрд░рдг рдХрд░реЗрдВ Thread.sleep(3000); } catch (InterruptedException e) { e.printStackTrace(); } System.out.println("Ended runnable " + name); } } public class Main { public static void main(String[] args) { // 6 threads рдХреЗ рд╕рд╛рде рдПрдХ fixed thread pool рдмрдирд╛рдПрдВ ExecutorService executorService = Executors.newFixedThreadPool(6); // executor service рдореЗрдВ 12 runnable tasks рдЬрдорд╛ рдХрд░реЗрдВ for (int i = 1; i <= 12; i++) { executorService.execute(new SomeRunnable("Runnable-" + i)); } // executor service рдХреЛ рдмрдВрдж рдХрд░реЗрдВ executorService.shutdown(); } } |
рдХреЛрдб рд╡реНрдпрд╛рдЦреНрдпрд╛
- Runnable Tasks рдмрдирд╛рдирд╛:
SomeRunnable
рдХреНрд▓рд╛рд╕Runnable
рдЗрдВрдЯрд░рдлреЗрд╕ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рддреА рд╣реИред- рдкреНрд░рддреНрдпреЗрдХ runnable рдПрдХ start рд╕рдВрджреЗрд╢ рдкреНрд░рд┐рдВрдЯ рдХрд░рддрд╛ рд╣реИ, рдХрд╛рд░реНрдп рдХреЛ рдЕрдиреБрдХрд░рдг рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП 3 рд╕реЗрдХрдВрдб рдХреЗ рд▓рд┐рдП рд╕реЛрддрд╛ рд╣реИ, рдФрд░ рдлрд┐рд░ рдПрдХ end рд╕рдВрджреЗрд╢ рдкреНрд░рд┐рдВрдЯ рдХрд░рддрд╛ рд╣реИред
- ExecutorService рдХреЛ рдЗрдирд┐рд╢рд┐рдпрд▓рд╛рдЗрдЬ рдХрд░рдирд╛:
Executors.newFixedThreadPool(6)
рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ 6 threads рдХреЗ рд╕рд╛рде рдПрдХ fixed thread pool рдмрдирд╛рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред
- Tasks рдЬрдорд╛ рдХрд░рдирд╛:
- рдПрдХ рд▓реВрдк 12 runnable tasks рдХреЛ executor service рдореЗрдВ рдЬрдорд╛ рдХрд░рддрд╛ рд╣реИред
- executor service рдпрд╣ рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░рддрд╛ рд╣реИ рдХрд┐ рдХреЗрд╡рд▓ 6 threads рдПрдХ рд╕рдордп рдореЗрдВ рдЪрд▓реЗрдВред
- Shutdown рдХрд░рдирд╛:
- рд╕рднреА tasks рдЬрдорд╛ рдХрд░рдиреЗ рдХреЗ рдмрд╛рдж, рдирдпрд╛ task рдЬрдорд╛ рд╣реЛрдиреЗ рд╕реЗ рд░реЛрдХрдиреЗ рдХреЗ рд▓рд┐рдП
executorService.shutdown()
рдХреЙрд▓ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред - рд╕реЗрд╡рд╛ рд╕рднреА рдЬрдорд╛ рдХрд┐рдП рдЧрдП tasks рдкреВрд░реЗ рд╣реЛрдиреЗ рдХреЗ рдмрд╛рдж рдзреАрд░реЗ-рдзреАрд░реЗ рдмрдВрдж рд╣реЛ рдЬрд╛рддреА рд╣реИред
- рд╕рднреА tasks рдЬрдорд╛ рдХрд░рдиреЗ рдХреЗ рдмрд╛рдж, рдирдпрд╛ task рдЬрдорд╛ рд╣реЛрдиреЗ рд╕реЗ рд░реЛрдХрдиреЗ рдХреЗ рд▓рд┐рдП
рдкреНрд░рддреНрдпрд╛рд╢рд┐рдд Output
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 |
Started runnable Runnable-1 Started runnable Runnable-2 Started runnable Runnable-3 Started runnable Runnable-4 Started runnable Runnable-5 Started runnable Runnable-6 (After 3 seconds) Ended runnable Runnable-1 Ended runnable Runnable-2 Ended runnable Runnable-3 Ended runnable Runnable-4 Ended runnable Runnable-5 Ended runnable Runnable-6 Started runnable Runnable-7 Started runnable Runnable-8 Started runnable Runnable-9 Started runnable Runnable-10 Started runnable Runnable-11 Started runnable Runnable-12 (After another 3 seconds) Ended runnable Runnable-7 Ended runnable Runnable-8 Ended runnable Runnable-9 Ended runnable Runnable-10 Ended runnable Runnable-11 Ended runnable Runnable-12 |
рдбрд╛рдпрдЧреНрд░рд╛рдо
(рдиреЛрдЯ: URL рдХреЛ рдПрдХ рд╡рд╛рд╕реНрддрд╡рд┐рдХ рдбрд╛рдпрдЧреНрд░рд╛рдо рд╕реЗ рдмрджрд▓реЗрдВ рдЬреЛ ThreadPool рд╡рд╛рд╕реНрддреБрдХрд▓рд╛ рдХреЛ рджрд░реНрд╢рд╛рддрд╛ рд╣реЛред)
рд╕рд░реНрд╡реЛрддреНрддрдо рдкреНрд░рдерд╛рдПрдБ рдФрд░ рдЕрдиреБрдХреВрд▓рди
ThreadPool
рдХрд╛ рдЕрдзрд┐рдХрддрдо рд▓рд╛рдн рдЙрдард╛рдиреЗ рдХреЗ рд▓рд┐рдП, рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рд╕рд░реНрд╡реЛрддреНрддрдо рдкреНрд░рдерд╛рдУрдВ рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░реЗрдВ:
1. рд╕рд╣реА Thread Pool рдЖрдХрд╛рд░ рдЪреБрдиреЗрдВ
- Optimal Size рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд░реЗрдВ: threads рдХреА рд╕рдВрдЦреНрдпрд╛ рдХреЛ рд╕рд┐рд╕реНрдЯрдо рдХреА рдХреНрд╖рдорддрд╛рдУрдВ рдФрд░ рдХрд╛рд░реНрдпреЛрдВ рдХреА рдкреНрд░рдХреГрддрд┐ рдХреЗ рдЕрдиреБрд░реВрдк рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдПред
- CPU-bound Tasks: рдЙрди рдХрд╛рд░реНрдпреЛрдВ рдХреЗ рд▓рд┐рдП рдЬреЛ рдорд╣рддреНрд╡рдкреВрд░реНрдг CPU рдкреНрд░реЛрд╕реЗрд╕рд┐рдВрдЧ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИ, threads рдХреА рдЖрджрд░реНрд╢ рд╕рдВрдЦреНрдпрд╛ рдЖрдорддреМрд░ рдкрд░ рдЙрдкрд▓рдмреНрдз рдкреНрд░реЛрд╕реЗрд╕рд░реЛрдВ рдХреА рд╕рдВрдЦреНрдпрд╛ рдХреЗ рдмрд░рд╛рдмрд░ рд╣реЛрддреА рд╣реИред
- I/O-bound Tasks: рдЙрди рдХрд╛рд░реНрдпреЛрдВ рдХреЗ рд▓рд┐рдП рдЬреЛ I/O operations рдХрд╛ рдЗрдВрддрдЬрд╛рд░ рдХрд░рддреЗ рд╣реИрдВ, threads рдХреА рдмрдбрд╝реА рд╕рдВрдЦреНрдпрд╛ рдлрд╛рдпрджреЗрдордВрдж рд╣реЛ рд╕рдХрддреА рд╣реИред
1234int availableProcessors = Runtime.getRuntime().availableProcessors();ExecutorService executorService = Executors.newFixedThreadPool(availableProcessors);
2. рдЕрдкрд╡рд╛рджреЛрдВ рдХреЛ рд╕рд╣рдЬрддрд╛ рд╕реЗ рд╕рдВрднрд╛рд▓реЗрдВ
- Thread Pool рдХреЛ рдлрдВрд╕рд╛ рд░рд╣рдиреЗ рд╕реЗ рд░реЛрдХреЗрдВ: рдмрд┐рдирд╛ рд╣реИрдВрдбрд▓ рдХрд┐рдП рдЧрдП рдЕрдкрд╡рд╛рдж threads рдХреЗ рдирд┐рд╖реНрдкрд╛рджрди рдХреЛ рдмрд╛рдзрд┐рдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред Runnable tasks рдХреЗ рднреАрддрд░ try-catch рдмреНрд▓реЙрдХ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВред
12345678910@Overridepublic void run() {try {// рдХрд╛рд░реНрдп рд▓реЙрдЬрд┐рдХ} catch (Exception e) {e.printStackTrace();}}
3. рдЙрдкрдпреБрдХреНрдд Queue рдкреНрд░рдХрд╛рд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВ
- Bounded Queues: рдирд┐рд╖реНрдкрд╛рджрди рдХреЗ рд▓рд┐рдП рдкреНрд░рддреАрдХреНрд╖рд╛ рдХрд░ рд░рд╣реЗ рдХрд╛рд░реНрдпреЛрдВ рдХреА рд╕рдВрдЦреНрдпрд╛ рдХреЛ рд╕реАрдорд┐рдд рдХрд░реЗрдВ рддрд╛рдХрд┐ memory issues рд╕реЗ рдмрдЪрд╛ рдЬрд╛ рд╕рдХреЗред
123456BlockingQueue<Runnable> queue = new ArrayBlockingQueue<>(100);ExecutorService executorService = new ThreadPoolExecutor(6, 12, 60L, TimeUnit.SECONDS, queue);
4. Thread Pool рдкреНрд░рджрд░реНрд╢рди рдХреА рдирд┐рдЧрд░рд╛рдиреА рдХрд░реЗрдВ рдФрд░ рдЯреНрдпреВрди рдХрд░реЗрдВ
- Monitoring Tools рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВ: VisualVM рдпрд╛ JConsole рдЬреИрд╕реЗ рдЯреВрд▓реНрд╕ thread pool рдХреЗ рдкреНрд░рджрд░реНрд╢рди рдХреА рдирд┐рдЧрд░рд╛рдиреА рдореЗрдВ рдорджрдж рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред
- Metrics рдХреЗ рдЖрдзрд╛рд░ рдкрд░ рд╕рдорд╛рдпреЛрдЬрди рдХрд░реЗрдВ: рджреЗрдЦреЗ рдЧрдП рдкреНрд░рджрд░реНрд╢рди рдФрд░ resource utilization рдХреЗ рдЖрдзрд╛рд░ рдкрд░ thread pool рдЖрдХрд╛рд░ рдФрд░ queue рдХреНрд╖рдорддрд╛ рдХреЛ рд╕рдВрд╢реЛрдзрд┐рдд рдХрд░реЗрдВред
рдирд┐рд╖реНрдХрд░реНрд╖
рдХреБрд╢рд▓ thread рдкреНрд░рдмрдВрдзрди рдЙрдЪреНрдЪ-рдкреНрд░рджрд░реНрд╢рди, рд╕реНрдХреЗрд▓реЗрдмрд▓ Java рдЕрдиреБрдкреНрд░рдпреЛрдЧреЛрдВ рдХреЗ рдирд┐рд░реНрдорд╛рдг рдХреЗ рд▓рд┐рдП рдорд╣рддреНрд╡рдкреВрд░реНрдг рд╣реИред ExecutorService рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдПрдХ ThreadPool рд▓рд╛рдЧреВ рдХрд░рдирд╛ system рд╕рдВрд╕рд╛рдзрдиреЛрдВ рдХреЛ рдЕрдзрд┐рдХрддрдо рд░реВрдк рд╕реЗ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рдмрд┐рдирд╛ рдХрдИ concurrent tasks рдХреЛ рд╕рдВрднрд╛рд▓рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдордЬрдмреВрдд рд╕рдорд╛рдзрд╛рди рдкреНрд░рджрд╛рди рдХрд░рддрд╛ рд╣реИред threads рдХреЛ рдкреБрди: рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ, concurrency рдХреЛ рдирд┐рдпрдВрддреНрд░рд┐рдд рдХрд░рдХреЗ, рдФрд░ resource utilization рдХреЛ рдЕрдиреБрдХреВрд▓рд┐рдд рдХрд░рдХреЗ, рдбреЗрд╡рд▓рдкрд░реНрд╕ рдЕрдиреБрдкреНрд░рдпреЛрдЧ рдХреЗ рдкреНрд░рджрд░реНрд╢рди рдФрд░ рд╡рд┐рд╢реНрд╡рд╕рдиреАрдпрддрд╛ рдореЗрдВ рдХрд╛рдлреА рд╕реБрдзрд╛рд░ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред
рдореБрдЦреНрдп takeaways
- ThreadPool Efficiency рдмрдврд╝рд╛рддрд╛ рд╣реИ: thread рдирд┐рд░реНрдорд╛рдг рдФрд░ рд╡рд┐рдирд╛рд╢ рд╕реЗ рдЬреБрдбрд╝рд╛ overhead рдХрдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП threads рдХреЛ рдкреБрди: рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИред
- ExecutorService Management рдХреЛ рд╕рд░рд▓ рдмрдирд╛рддрд╛ рд╣реИ: thread pools рдФрд░ task execution рдХрд╛ рдкреНрд░рдмрдВрдзрди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рд▓рдЪреАрд▓рд╛ framework рдкреНрд░рджрд╛рди рдХрд░рддрд╛ рд╣реИред
- Optimal Configuration рдорд╣рддреНрд╡рдкреВрд░реНрдг рд╣реИ: thread pool рдХрд╛ рд╕рд╣реА рдЖрдХрд╛рд░ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд░рдирд╛ рдФрд░ рдЕрдкрд╡рд╛рджреЛрдВ рдХреЛ рд╕рдВрднрд╛рд▓рдирд╛ smooth рдФрд░ рдХреБрд╢рд▓ рд╕рдВрдЪрд╛рд▓рди рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░рддрд╛ рд╣реИред
рдЗрди рдкреНрд░рдерд╛рдУрдВ рдХреЛ рдЕрдкрдиреЗ рд╡рд┐рдХрд╛рд╕ рдХрд╛рд░реНрдпрдкреНрд░рд╡рд╛рд╣ рдореЗрдВ рдЕрдкрдирд╛рдиреЗ рд╕реЗ рдЖрдкрдХреЗ рдЕрдиреБрдкреНрд░рдпреЛрдЧ рдЕрдзрд┐рдХ responsive рдФрд░ resilient рдмрдиреЗрдВрдЧреЗ, рдЬреЛ рдЬрдЯрд┐рд▓, multithreaded operations рдХреЛ рдЖрд╕рд╛рдиреА рд╕реЗ рд╕рдВрднрд╛рд▓рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рд╣реЛрдВрдЧреЗред
рдиреЛрдЯ: рдпрд╣ рд▓реЗрдЦ AI рджреНрд╡рд╛рд░рд╛ рдЙрддреНрдкрдиреНрди рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред
рдЕрддрд┐рд░рд┐рдХреНрдд рд╕рдВрд╕рд╛рдзрди
- Java Concurrency in Practice by Brian Goetz
- Official Java Documentation on Executors
- Understanding Java Thread Pools
- VisualVM Monitoring Tool
- Java Fork/Join Framework