1. Executors์ ์ญํ
Thread ๋ง๋ค๊ธฐ : Application์ด ์ฌ์ฉํ Thread Pool์ ๋ง๋ค์ด์ ๊ด๋ฆฌํจ.
Thread ๊ด๋ฆฌ : Thread์ ์๋ช ์ฃผ๊ธฐ๋ฅผ ๊ด๋ฆฌ ํจ.
์์ ์ฒ๋ฆฌ ๋ฐ ์คํ : Thread๋ก ์คํํ ์์ ์ ์ ๊ณตํ ์ ์๋ API๋ฅผ ์ ๊ณตํจ.
2. ์ฃผ์ Interface
Executors
โExecute(Runnable(Click)) : ๋ฑ ํ๋์ ๋ฉ์๋๋ง ์กด์ฌ.
โ Executors๋ฅผ ์์๋ฐ์ ์ธํฐํ์ด์ค๋ก, Callable(Click)๋ ์คํํ ์ ์์ผ๋ฉฐ
โ Executors๋ฅผ ์ข ๋ฃ ์ํค๊ฑฐ๋ ์ฌ๋ฌ Callable์ ๋์์ ์คํํ๋ ๋ฑ์ ๊ธฐ๋ฅ์ ์ ๊ณตํจ.
3. Single Thread
//์ฑ๊ธ์ค๋ ๋ ์ฌ์ฉ
ExecutorService executorService = Executors.newSingleThreadExecutor();
//์ฌ์ฉ๋ฐฉ๋ฒ 1 : execute(new Runnable()) ๊ณ ์ ์ ์ธ ๋ฐฉ๋ฒ
executorService.execute(new Runnable() {
@Override
public void run() {
System.out.println("1. Thread "+Thread.currentThread().getName());
}
});
//์ฌ์ฉ๋ฐฉ๋ฒ 2 : submit()
executorService.submit(()-> {
System.out.println("2. Thread "+Thread.currentThread().getName());
});
/*
executorService๋ ์์
์ ์คํํ๊ณ ๋๋ฉด ๋ค์ ์์
์ด ๋ค์ด์ฌ๋๊น์ง ๊ณ์ํด์ ๋๊ธฐํ๋ฏ๋ก
ํ๋ก์ธ์ค๊ฐ ์ข
๋ฃ๋์ง ์๋๋ค -> ๋ฐ๋ผ์ ๋ช
์์ ์ผ๋ก ํ๋ก์ธ์ค๋ฅผ ์ข
๋ฃํด์ค์ผ ํ๋ค
shutdown() _ gracefullํ๋ค ์ฆ, ํ๊ณ ์๋ ์ผ์ ๋ง๋ฌด๋ฆฌํ๊ณ ์ข
๋ฃ
shutdownNow() _ noMercyํ๋ค, ์ผ์ ๋ง๋ฌด๋ฆฌ๋ฅผ ๋ณด์ฅํ์ง ์๊ณ ๊ทธ๋ฅ ์ข
๋ฃ
*/
executorService.shutdown();
4. ์ํ๋ Thread Pool ๊ฐ์๋ก ์ ํํ๊ธฐ
//2๊ฐ์ ์ฐ๋ ๋๋ฅผ ๊ณ ์ ์ฐ๋ ๋ ๊ฐ์๋ก ์ฌ์ฉํ๊ฒ ๋ค
ExecutorService executorService = Executors.newFixedThreadPool(2);
executorService.submit(getRunnable("Hello"));
executorService.submit(getRunnable("woonsik"));
executorService.submit(getRunnable("the"));
executorService.submit(getRunnable("java"));
executorService.submit(getRunnable("Thread"));
executorService.shutdown();
private static Runnable getRunnable(String string) {
return ()-> System.out.println(string + Thread.currentThread().getName());
}
/*
์ด๋ป๊ฒ 2๊ฐ์ ์ฐ๋ ๋๋ก 5๊ฐ์ ์์
์ ์ํ?
๋ฉ์ธ์์ executor service์ 5๊ฐ์ ์์
์ ๋ณด๋ธ๋ค
-> Thread pool์๋ 2๊ฐ์ ์ฐ๋ ๋๋ง ์กด์ฌ && Blocking Queue๊ฐ ์กด์ฌ
-> ์ฐ๋ ๋๊ฐ ๋ฐ์๋ฉด ๋๋จธ์ง๋ blocking queue์์ ๊ธฐ๋ค๋ฆฌ๊ณ ์๋ค๊ฐ ์ํ์ด ๋๋ค
5. ScheduleExecutorService
โ ExecutorService๋ฅผ ์์๋ฐ์ ์ธํฐํ์ด์ค๋ก ํน์ ์๊ฐ ์ดํ
โ ๋๋ ์ฃผ๊ธฐ์ ์ผ๋ก ์์ ์ ์คํํ ์ ์์.
System.out.println("์ฑ๊ธ์ฐ๋ ๋ ์ฐ์ผ์ฅดexecutors");
ScheduledExecutorService executorService =
Executors.newSingleThreadScheduledExecutor();
//3์ด ๋๊ธฐ ํ ์ถ๋ ฅ (Runnable command, long delay, TimeUnit unit) <- ๋งค๊ฐ๋ณ์
executorService.schedule(getRunnable("Hello"), 3, TimeUnit.SECONDS);
executorService.shutdown();
//ํน์ ์๊ฐ๋ง๋ค ๋ฐ๋ณต - 1์ด๊ธฐ๋ค๋ ธ๋ค๊ฐ 2์ด๋ง๋ค ๋ฐ๋ณต (command, initial delay,
period, TimeUnit unit)
executorService.scheduleAtFixedRate(getRunnable("hello"),
1, 2, TimeUnit.SECONDS);