๋ค๋ฅธ ์ ํ์ ์ค๋ ๋ ํ์ "์บ์"์ ๋๋ค. ์ด๋ฌํ ์ค๋ ๋ ํ์ ๊ณ ์ ์ค๋ ๋ ํ๋งํผ ์ผ๋ฐ์ ์ผ๋ก ์ฌ์ฉ๋ฉ๋๋ค.
์ด๋ฆ์์ ์ ์ ์๋ฏ์ด ์ด๋ฌํ ์ข ๋ฅ์ ์ค๋ ๋ ํ์ ์ค๋ ๋๋ฅผ ์บ์ํฉ๋๋ค. ์ฌ์ฉํ์ง ์๋ ์ค๋ ๋๋ฅผ ์ ํ๋ ์๊ฐ ๋์ ํ์ฑ ์ํ๋ก ์ ์งํ์ฌ ํด๋น ์ค๋ ๋๋ฅผ ์ฌ์ฌ์ฉํ์ฌ ์ ์์ ์ ์ํํฉ๋๋ค. ์ด๋ฌํ ์ค๋ ๋ ํ์ ํฉ๋ฆฌ์ ์ธ ์์ ๊ฐ๋ฒผ์ด ์์ ์ด ์์ ๋ ๊ฐ์ฅ ์ ํฉํฉ๋๋ค.
"ํฉ๋ฆฌ์ ์ธ ๊ธ์ก"์ ์๋ฏธ๋ ๋ค์ ๊ด๋ฒ์ํ์ง๋ง ์ด๋ฌํ ํ์ด ๋ชจ๋ ์์ ์์ ์ ํฉํ์ง ์๋ค๋ ์ ์ ์์์ผ ํฉ๋๋ค. ์๋ฅผ ๋ค์ด ๋ฐฑ๋ง ๊ฐ์ ์์ ์ ๋ง๋ค๊ณ ์ถ๋ค๊ณ ๊ฐ์ ํฉ๋๋ค. ๊ฐ ์์ ์ ์์ฃผ ์ ์ ์๊ฐ์ด ๊ฑธ๋ฆฌ๋๋ผ๋ ์ฌ์ ํ ๋ถํฉ๋ฆฌํ ์์ ๋ฆฌ์์ค๋ฅผ ์ฌ์ฉํ๊ณ ์ฑ๋ฅ์ ์ ํ์ํต๋๋ค. ์๋ฅผ ๋ค์ด I/O ์์ ๊ณผ ๊ฐ์ด ์คํ ์๊ฐ์ ์์ธกํ ์ ์๋ ๊ฒฝ์ฐ์๋ ์ด๋ฌํ ํ์ ํผํด์ผ ํฉ๋๋ค.
๋ด๋ถ์ ์ผ๋ก ThreadPoolExecutor ์์ฑ์๋ ๋ค์ ์ธ์๋ฅผ ์ฌ์ฉํ์ฌ ํธ์ถ๋ฉ๋๋ค.
public static ExecutorService newCachedThreadPool() {
return new ThreadPoolExecutor(0, Integer.MAX_VALUE, 60L, TimeUnit.SECONDS,
new SynchronousQueue<Runnable>());
}
๋ค์ ๊ฐ์ ์์ฑ์์ ์ธ์๋ก ์ ๋ฌ๋ฉ๋๋ค.
๋ชจ์ | ๊ฐ |
---|---|
corePoolSize ( ์คํ์ ์๋น์ค๊ฐ ์์๋ ๋ ์ค๋น(์์)๋ ์ค๋ ๋ ์ ) | 0 |
maximumPoolSize ( ์คํ๊ธฐ ์๋น์ค๊ฐ ์์ฑํ ์ ์๋ ์ต๋ ์ค๋ ๋ ์ ) | ์ ์.MAX_VALUE |
keepAliveTime (์ค๋ ๋ ์๊ฐ corePoolSize ๋ณด๋ค ํฐ ๊ฒฝ์ฐ ํด์ ๋ ์ค๋ ๋๊ฐ ์๋ฉธ๋๊ธฐ ์ ์ ๊ณ์ ์ ์ง๋๋ ์๊ฐ ) | 60L |
๋จ์ (์๊ฐ ๋จ์) | TimeUnit.SECONDS |
workQueue (๋๊ธฐ์ด ๊ตฌํ) | ์๋ก์ด SynchronousQueue<์คํ ๊ฐ๋ฅ>() |
๊ทธ๋ฆฌ๊ณ ์ ํํ ๊ฐ์ ๋ฐฉ์์ผ๋ก ์ฐ๋ฆฌ ์์ ์ ThreadFactory ๊ตฌํ์ ์ ๋ฌํ ์ ์์ต๋๋ค.
SynchronousQueue์ ๋ํด ์์๋ณด๊ฒ ์ต๋๋ค.
๋๊ธฐ์ ์ ์ก์ ๊ธฐ๋ณธ ์์ด๋์ด๋ ๋งค์ฐ ๊ฐ๋จํ์ง๋ง ์ง๊ด์ ๋ฐํฉ๋๋ค(์ฆ, ์ง๊ฐ์ด๋ ์์์ผ๋ก ๋ณผ ๋ ๊ทธ๊ฒ์ด ํ๋ ธ๋ค๋ ๊ฒ์ ์ ์ ์์ต๋๋ค). ๊ฐ์ ์๊ฐ. ์ฆ, ์ ์์ ์ด ๋์ฐฉํ์๋ง์ ์คํ ์ค์ธ ์ค๋ ๋๊ฐ ์ด๋ฏธ ์์ ์ ์ ํํ๊ธฐ ๋๋ฌธ์ ๋๊ธฐ ๋๊ธฐ์ด์๋ ์์ ์ด ์์ ์ ์์ต๋๋ค .
์ ์์ ์ด ๋๊ธฐ์ด์ ๋ค์ด์ฌ ๋ ํ์ ์ฌ์ฉ ๊ฐ๋ฅํ ํ์ฑ ์ค๋ ๋๊ฐ ์์ผ๋ฉด ์์ ์ ์ ํํฉ๋๋ค. ๋ชจ๋ ์ค๋ ๋๊ฐ ์ฌ์ฉ ์ค์ด๋ฉด ์ ์ค๋ ๋๊ฐ ์์ฑ๋ฉ๋๋ค.
์บ์๋ ํ์ 0๊ฐ์ ์ค๋ ๋๋ก ์์ํ์ฌ ์ ์ฌ์ ์ผ๋ก Integer.MAX_VALUE ์ค๋ ๋๋ก ํ์ฅ๋ ์ ์์ต๋๋ค. ๊ธฐ๋ณธ์ ์ผ๋ก ์บ์๋ ์ค๋ ๋ ํ์ ํฌ๊ธฐ๋ ์์คํ ๋ฆฌ์์ค์ ์ํด์๋ง ์ ํ๋ฉ๋๋ค.
์์คํ ๋ฆฌ์์ค๋ฅผ ์ ์ฝํ๊ธฐ ์ํด ์บ์๋ ์ค๋ ๋ ํ์ 1๋ถ ๋์ ์ ํด ์ํ์ธ ์ค๋ ๋๋ฅผ ์ ๊ฑฐํฉ๋๋ค.
์ค์ ๋ก ์ด๋ป๊ฒ ์๋ํ๋์ง ๋ด ์๋ค. ์ฌ์ฉ์ ์์ฒญ์ ๋ชจ๋ธ๋งํ๋ ํ์คํฌ ํด๋์ค๋ฅผ ์์ฑํฉ๋๋ค.
public class Task implements Runnable {
int taskNumber;
public Task(int taskNumber) {
this.taskNumber = taskNumber;
}
@Override
public void run() {
System.out.println("Processed user request #" + taskNumber + " on thread " + Thread.currentThread().getName());
}
}
๊ธฐ๋ณธ ๋ฉ์๋ ์์ newCachedThreadPool์ ์์ฑํ ๋ค์ ์คํ์ ์ํด 3๊ฐ์ ์์ ์ ์ถ๊ฐํฉ๋๋ค. ์ฌ๊ธฐ์ ์๋น์ค ์ํ๋ฅผ ์ธ์ํฉ๋๋ค (1) .
๋ค์์ผ๋ก 30์ด ๋์ ์ผ์ ์ค์งํ๊ณ ๋ค๋ฅธ ์์ ์ ์์ํ๊ณ ์ํ (2) ๋ฅผ ํ์ํฉ๋๋ค .
๊ทธ๋ฐ ๋ค์ ๋ฉ์ธ ์ค๋ ๋๋ฅผ 70์ด ๋์ ์ผ์ ์ค์งํ๊ณ ์ํ (3)๋ฅผ ์ธ์ํ ๋ค์ ๋ค์ 3๊ฐ์ ์์ ์ ์ถ๊ฐํ๊ณ ์ํ (4) ๋ฅผ ๋ค์ ์ธ์ํฉ๋๋ค .
์์ ์ ์ถ๊ฐํ ์งํ์ ์ํ๋ฅผ ํ์ํ๋ ์์น์์ ์ต์ ์ถ๋ ฅ์ ์ํด ๋จผ์ 1์ด ์ ์ ์ ์ถ๊ฐํฉ๋๋ค.
ExecutorService executorService = Executors.newCachedThreadPool();
for (int i = 0; i < 3; i++) {
executorService.submit(new Task(i));
}
TimeUnit.SECONDS.sleep(1);
System.out.println(executorService); //(1)
TimeUnit.SECONDS.sleep(30);
executorService.submit(new Task(3));
TimeUnit.SECONDS.sleep(1);
System.out.println(executorService); //(2)
TimeUnit.SECONDS.sleep(70);
System.out.println(executorService); //(3)
for (int i = 4; i < 7; i++) {
executorService.submit(new Task(i));
}
TimeUnit.SECONDS.sleep(1);
System.out.println(executorService); //(4)
executorService.shutdown();
๊ฒฐ๊ณผ๋ ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
pool-1-thread-2 ์ค๋ ๋์์ ์ฒ๋ฆฌ๋ ์ฌ์ฉ์ ์์ฒญ
#1 pool-1-thread-3 ์ค๋ ๋์์ ์ฒ๋ฆฌ๋ ์ฌ์ฉ์ ์์ฒญ #2
(1) java.util.concurrent .ThreadPoolExecutor@f6f4d33[์คํ ์ค, ํ ํฌ๊ธฐ = 3, ํ์ฑ ์ค๋ ๋ = 0, ๋๊ธฐ ์ค์ธ ์์ = 0, ์๋ฃ๋ ์์ = 3]
pool-1-thread-2 ์ค๋ ๋
(2) java.util.concurrent์์ ์ฒ๋ฆฌ๋ ์ฌ์ฉ์ ์์ฒญ #3. ThreadPoolExecutor@f6f4d33[์คํ ์ค, ํ ํฌ๊ธฐ = 3, ํ์ฑ ์ค๋ ๋ = 0, ๋๊ธฐ ์ค์ธ ์์ = 0, ์๋ฃ๋ ์์ = 4] (3)
java.util.concurrent.ThreadPoolExecutor@f6f4d33[์คํ ์ค, ํ ํฌ๊ธฐ = 0, ํ์ฑ ์ค๋ ๋ = 0 , ๋๊ธฐ ์ค์ธ ์์ = 0, ์๋ฃ๋ ์์ = 4]
pool-1-thread-4 ์ค๋ ๋์์ ์ฒ๋ฆฌ๋ ์ฌ์ฉ์ ์์ฒญ #4
pool-1-thread-5 ์ค๋ ๋์์ ์ฒ๋ฆฌ๋ ์ฌ์ฉ์ ์์ฒญ #5
pool-1-thread-4 ์ค๋ ๋
(4)์์ ์ฒ๋ฆฌ๋ ์ฌ์ฉ์ ์์ฒญ #6 java.util.concurrent.ThreadPoolExecutor@f6f4d33[์คํ ์ค, ํ ํฌ๊ธฐ = 2, ํ์ฑ ์ค๋ ๋ = 0, ๋๊ธฐ ์ค์ธ ์์ = 0, ์๋ฃ๋ ์์ = 7]
๊ฐ ๋จ๊ณ๋ฅผ ์ดํด๋ณด๊ฒ ์ต๋๋ค.
๋จ๊ณ | ์ค๋ช |
---|---|
1(์์ 3๊ฐ ์๋ฃ ํ) | ์ฐ๋ฆฌ๋ 3๊ฐ์ ์ค๋ ๋๋ฅผ ์์ฑํ๊ณ ์ด 3๊ฐ์ ์ค๋ ๋์์ 3๊ฐ์ ์์
์ด ์คํ๋์์ต๋๋ค. ์ํ๊ฐ ํ์๋๋ฉด 3๊ฐ์ง ์์ ์ด ๋ชจ๋ ์๋ฃ๋๊ณ ์ค๋ ๋๊ฐ ๋ค๋ฅธ ์์ ์ ์ํํ ์ค๋น๊ฐ ๋ ๊ฒ์ ๋๋ค. |
2(30์ด ์ผ์ ์ค์ง ํ ๋ค๋ฅธ ์์ ์คํ) | 30์ด ๋์ ํ๋์ด ์์ผ๋ฉด ์ค๋ ๋๋ ์ฌ์ ํ ํ์ฑ ์ํ์ด๋ฉฐ ์์
์ ๊ธฐ๋ค๋ฆฝ๋๋ค. ๋๋จธ์ง ๋ผ์ด๋ธ ์ค๋ ๋ ํ์์ ๊ฐ์ ธ์จ ์ค๋ ๋์์ ๋ค๋ฅธ ์์ ์ด ์ถ๊ฐ๋๊ณ ์คํ๋ฉ๋๋ค. ํ์ ์ถ๊ฐ๋ ์ ์ค๋ ๋๊ฐ ์์ต๋๋ค. |
3(70์ด ์ผ์ ์ค์ง ํ) | ์ค๋ ๋๊ฐ ํ์์ ์ ๊ฑฐ๋์์ต๋๋ค. ์์ ์ ์๋ฝํ ์ค๋น๊ฐ ๋ ์ค๋ ๋๊ฐ ์์ต๋๋ค. |
4(3๊ฐ์ ์์ ์ ๋ ์คํํ ํ) | ๋ ๋ง์ ์์ ์ด ์์ ๋ ํ ์ ์ค๋ ๋๊ฐ ์์ฑ๋์์ต๋๋ค. ์ด๋ฒ์๋ ๋ ๊ฐ์ ์ค๋ ๋๋ง 3๊ฐ์ ์์ ์ ์ฒ๋ฆฌํ์ต๋๋ค. |
์ด์ ๋ค๋ฅธ ์ ํ์ ์คํ์ ์๋น์ค ๋ ผ๋ฆฌ์ ์ต์ํด์ก์ต๋๋ค.
Executors ์ ํธ๋ฆฌํฐ ํด๋์ค ์ ๋ค๋ฅธ ๋ฉ์๋์ ์ ์ฌํ๊ฒ newCachedThreadPool ๋ฉ์๋์๋ ThreadFactory ๊ฐ์ฒด๋ฅผ ์ธ์๋ก ์ฌ์ฉํ๋ ์ค๋ฒ๋ก๋๋ ๋ฒ์ ๋ ์์ต๋๋ค .
GO TO FULL VERSION