
๊ฐ๋ฐ์ ์ทจ์
์ด ์๋ผ์ ํฌ๊ธฐํ๊ณ ์๋์ ํด์ ํผ์๋ฐฉ(Process) ์ ์ฐจ๋ฆฐ ์ค์์จ,
ํผ์๋ฐฉ์ ์ด์ ๊ท์น(๋ฉ๋ด,๊ฐ๊ฒฉ,์๋น์ค ๋ฑ๋ฑ)(Application) ์ ๊ตฌ์ถํ๋ค
ํผ์๋ฐฉ์์ ์๋ฐ๋ฅผ ํ ์๋ฐ์(Thread) ๋ค์ ๋ฐ๋ ค์จ๋ค.
// ์๋ฐ์(Thread) ๊ตฌํ
class PCRoomWorker extends Thread {
private String name;
public PCRoomWorker(String name) {
this.name = name;
}
@Override
public void run() {
System.out.println(name + " ์๋ฐ์์ด ์ผ์ ์์ํฉ๋๋ค!");
// ์ฃผ๋ฌธ ์ฒ๋ฆฌ ๋ก์ง
System.out.println(name + " ์๋ฐ์์ด ์ผ์ ๋ง์ณค์ต๋๋ค.");
}
}
PCRoomWorker worker1 = new PCRoomWorker("์ค๋ ๋1");
worker1.start(); // ์ค๋ ๋ ์์
์๋ฐ์์ ์ค๋ ๋๋ฅผ ๋ง๋๋ ๊ฐ์ฅ ๊ธฐ๋ณธ์ ์ธ ๋ฐฉ๋ฒ์ Thread ํด๋์ค๋ฅผ ์์๋ฐ๋ ๊ฒ์ด๋ค. run() ๋ฉ์๋๋ฅผ ์ค๋ฒ๋ผ์ด๋ํ์ฌ ์ค๋ ๋๊ฐ ์คํํ ์์ ์ ์ ์ํ๊ณ , start() ๋ฉ์๋๋ฅผ ํธ์ถํ์ฌ ์ค๋ ๋๋ฅผ ์คํํ๋ค. ์ด๋ ์ค์์จ์ ํผ์๋ฐฉ์์ ์๋ฐ์์ด ์ผ์ ์์ํ๋ ๊ฒ๊ณผ ๊ฐ๋ค.
์๋ฐ์๋ค์ ์๋์ ์ฃผ๋ฌธ์ด ์์ผ๋ฉด ๋๊ธฐ์ค(์ค๋ ๋ ํ)์์ ๋๊ธฐํ๋ฉด์ ๊ฟ์ ๋นจ ์ ์๋ค(Idle ์ํ)
์๋์ ์ฃผ๋ฌธ(Request) ์ด ๋ค์ด์ค๋ฉด ์ด๊ณณ์์ ํ๋์ ์ฃผ๋ฌธ์ ๋ํ ์์
์ ์ํํ๊ธฐ ์ํด ํ๋ช
์ ์๋ฐ์์ด ๋๊ฐ๊ฒ ๋๋ค(์คํ ์ํ)
๊ทธ๋ฆฌ๊ณ ์์
์ด ๋๋๋ฉด ๋ค์ ๋ค์ด์์ ๋ ์ฃผ๋ฌธ์ด ๋ค์ด์ค๊ธฐ ์ ๊น์ง ๊ฟ์ ๋นค๋ค.
ํ์ง๋ง ์ด ํผ์๋ฐฉ์ ์ฃผ๋ฌธ์ ์ฒ๋ฆฌ ๋ชปํ์ ๊ฒฝ์ฐ ๋ฐ๋ก ์งค๋ฆฌ๊ฒ ๋๋ค!(์์ธ ๋ฐ์ ํ ์ค๋ ๋ ์๋ฉธ)
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
public class PCRoomService {
public static void main(String[] args) {
// 5๋ช
์ ์๋ฐ์์ ๋๊ธฐ์ค(์ค๋ ๋ ํ)์ ๋ฐฐ์น
ExecutorService threadPool = Executors.newFixedThreadPool(5);
// ์ฃผ๋ฌธ์ด ๋ค์ด์ฌ ๋๋ง๋ค ์๋ฐ์์๊ฒ ์์
ํ ๋น
for (int i = 0; i < 10; i++) {
final int orderNum = i;
threadPool.execute(() -> {
System.out.println("์๋ฐ์ #" + Thread.currentThread().getId() +
"๊ฐ ์ฃผ๋ฌธ #" + orderNum + "์ ์ฒ๋ฆฌํฉ๋๋ค.");
try {
Thread.sleep(1000); // ์์
์๊ฐ
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("์ฃผ๋ฌธ #" + orderNum + " ์๋ฃ!");
});
}
// ๋ชจ๋ ์์
์ด ๋๋๋ฉด ์ค๋ ๋ ํ ์ข
๋ฃ
threadPool.shutdown();
}
}
ExecutorService๋ฅผ ์ฌ์ฉํ์ฌ ์ค๋ ๋ ํ์ ์์ฑํ๋ค. ์ด๋ ์ค์์จ์ ํผ์๋ฐฉ์์ ๋๊ธฐ์ค์ ์๋ฐ์๋ค์ ๋๊ธฐ์ํค๋ ๊ฒ๊ณผ ๊ฐ๋ค. ์ฃผ๋ฌธ(์์ )์ด ๋ค์ด์ค๋ฉด ์ค๋ ๋ ํ์์ ๊ฐ์ฉํ ์ค๋ ๋๋ฅผ ํ ๋นํ์ฌ ์ฒ๋ฆฌํ๊ณ , ์์ ์ด ๋๋๋ฉด ์ค๋ ๋๋ ๋ค์ ํ๋ก ๋์๊ฐ ๋ค์ ์์ ์ ๊ธฐ๋ค๋ฆฌ๊ฒ ๋๋ค.
์ค์์ ํผ์๋ฐฉ์๋ '๋ผ๋ฉด์ ๋์ด๋ ์ฃผ๋ฐฉ'์ด ์๋ค. ์ด ์ฃผ๋ฐฉ(์๊ณ์์ญ) ์์๋ ํ ๋ฒ์ ํ ๋ช
์ ์๋ฐ์๋ง ๋ค์ด๊ฐ ์ ์๋ค. ์๋ํ๋ฉด ๊ณต๊ฐ์ด ์ข์์ ๋ ๋ช
์ด ๋์์ ๋ค์ด๊ฐ๋ฉด ์๋ก ๋ถ๋ชํ๊ณ ์๋ฆฌ๊ฐ ์๋ง์ด ๋๊ธฐ ๋๋ฌธ์ด๋ค!
๊ทธ๋ฌ๋ ์ด๋ ๋ , ๋น ์ค๋ ์๋ฒฝ์ ์๋ ๋ ๋ช
์ด ๋์์ ์ฃผ๋ฌธ์ ํ๋ค
user1: "์งํ๊ตฌ๋ฆฌ์ ๋ํจ์ผ๊ฒน์ด ์ถ๊ฐ + ๊น๋ฐฅ ๋ฐ์ค"
user2: "์งํ๊ตฌ๋ฆฌ์ ๋ํจ์ผ๊ฒน์ด ์ถ๊ฐ + ์น์ฆ ๋ง์ ๋ฎ๋ฐฅ"
๋ ๋ช
์ ์๋ฐ์(Thread1, Thread2)์ด ๊ฐ๊ฐ ์ฃผ๋ฌธ์ ๋ฐ์๋ค. ๊ทธ๋ฐ๋ฐ ๋ฌธ์ ๋ ์งํ๊ตฌ๋ฆฌ๊ฐ ๋ฑ ํ ์ธ๋ถ๋ง ๋จ์์์๋ค! ํ์ง๋ง ๋ ์๋ฐ์ ๋ชจ๋
"๋จ์์๋ ์งํ๊ตฌ๋ฆฌ ํ์ธ โ ์๋ค! โ ๋ผ๋ฉด ํ๋ฑ ๋์ด๊ณ ์๋์ ๊ฐ์์ํค์!" ๊ณผ์ (๋ฆฌ์์ค ๋ณ๊ฒฝ)
์ ๊ฑฐ์น๋ ค ํ๋ค.
์งํ๊ตฌ๋ฆฌ๋ฅผ ์์ฑ์์ผ์ ์๋์๊ฒ ๊ฐ์ ธ๋ค์ค์ผ ํด๊ณ ๋ฅผ ์๋นํ๋๊น,
๋ ์๋ฐ์์ ๋ด๊ฐ ๋จผ์ ํ๊ฒ ๋ค๊ณ *์ฃผ๋ฐฉ์์์ ๋์น ์ธ์์ ํ๊ณ ์๋ค(๊ฒฝ์์ํ(Race Condition))**
๋ ์๋ฐ์์ด ๋์์ ๊ฐ์ ์ฌ๋ฃ๋ฅผ ์ฌ์ฉํ๋ ค๋ ์ํฉ์ด๋ค(๋์์ฑ์ด์).
์ด๋ฐ ์ํฉ์ด ๋ฐ์ํ๋ฉด ๋ค์๊ณผ ๊ฐ์ ๋ฌธ์ ๊ฐ ์๊ธด๋ค:
public class Kitchen {
private int ramyeonCount = 1; // ์งํ๊ตฌ๋ฆฌ 1๊ฐ๋ง ๋จ์
// ์ฌ๋ฌ ์ค๋ ๋๊ฐ ๋์์ ์ ๊ทผ ๊ฐ๋ฅํ ๋ผ๋ฉด ์ฃผ๋ฐฉ
public boolean cookRamyeon(String workerName) {
if (ramyeonCount > 0) {
System.out.println(workerName + ": ์งํ๊ตฌ๋ฆฌ๊ฐ " + ramyeonCount + "๊ฐ ๋จ์์๋ค!");
// ๋ผ๋ฉด ๋์ด๋๋ฐ ์๊ฐ์ด ๊ฑธ๋ฆฐ๋ค๊ณ ๊ฐ์
try {
Thread.sleep(1000); // ์ด ์๊ฐ ๋์ ๋ค๋ฅธ ์ค๋ ๋๋ ์ ๊ทผ ๊ฐ๋ฅ
} catch (InterruptedException e) {
e.printStackTrace();
}
ramyeonCount--; // ์ฌ๊ณ ๊ฐ์
System.out.println(workerName + ": ์งํ๊ตฌ๋ฆฌ ์กฐ๋ฆฌ ์๋ฃ! ๋จ์ ๊ฐ์: " + ramyeonCount);
return true;
} else {
System.out.println(workerName + ": ์งํ๊ตฌ๋ฆฌ๊ฐ ์์ด์! ์ฃผ๋ฌธ ์คํจ!");
return false;
}
}
}
์ด ์ฝ๋๋ฅผ ์คํํ๋ฉด ๋ ์ค๋ ๋ ๋ชจ๋ "์งํ๊ตฌ๋ฆฌ๊ฐ 1๊ฐ ๋จ์์๋ค!"๋ผ๊ณ ์ถ๋ ฅํ๊ณ , ๋ ๋ค ๋ผ๋ฉด์ ๋ง๋๋๋ฐ ์ฑ๊ณตํ๊ฒ ๋์ด ์ฌ๊ณ ๊ฐ -1์ด ๋ ์ ์๋ค. ํ์ง๋ง ์ค์ ๋ก๋ ์งํ๊ตฌ๋ฆฌ๊ฐ 1๊ฐ๋ฐ์ ์์๊ธฐ ๋๋ฌธ์ ์ด๋ ์๋ชป๋ ๊ฒฐ๊ณผ์ด๋ค.
์ธ์ฑ์ด ๋ฐ์ด๋ ์ค์ ์ฌ์ฅ๋์ ์ด์ฐจํผ ์ผํ ์ธ๋ ฅ์ ๋ง์ผ๋๊น,, ์งค๋ฆฐ ์ธ์ ์ ๋งํผ ๋ค์ ๋ฐ๋ ค์์ ๋๊ธฐ์ค์ ์ํ๋์ผ๋ฉด ๊ทธ๋ง์ด๋ค(์ค๋ ๋ ํ์์ ์๋ฉธ ๋ ์ค๋ ๋ ๋งํผ ์ฌ์์ฑ) ๋ผ๊ณ ์๊ฐํ๊ณ ๋ค์ ์๋ฐ์์ ๋ฐ๋ ค์จ๋ค
๐ฅฒ๊ทผ๋ฐ ๊ณ์ ์ด๋ฐ์์ผ๋ก ์ฅ์ฌ๋ฅผ ํ๋ฉด ์๋๋ค์ด ์์ด์ง๊ฑฐ ๊ฐ์์ ๋งํ ๊ฑฐ ๊ฐ๋ค๋ ์๊ฐ์ด ๋ ์ค์์จ ..
user 4 :"์ฌ๊ธด ๋ผ๋ฉด์ด ์์ผ ๋ฆ๊ฒ ๋์???! 1.9ms ๋ ๊ฑธ๋ ธ์์ !! ๋๋ ค ํฐ์ก๋ค!"
(๋๋ฆฐ ๋ผ๋ฉด ๋์ค๋ ์๋์ ๊ฐ๋นก์น ์๋)
user 5 : "ํ์ ์ฒ๋ฆฌ๋ฅผ ๋นจ๋ฆฌ ํ์์ด์ผ ์ฃผ๋ฌธ์ ์ํ์ง!! ์ฅ์ฌ ์ด๋ฐ๊ตฌ๋ก ํ ๊ฑฐ์ผ??!"
(์ ํํ ์ ๋ณด๋ฅผ ์ฃผ์ง ์์ ๊ฐ๋นก์น ์๋)
๊ฒฐ๊ตญ ์ค์์จ๋ ์ด๋ฐ ๋ฌธ์ ๋ค์ ํด๊ฒฐํ๊ธฐ ์ํด ์ฌ๋ฌ๊ฐ์ง ํด๊ฒฐ๋ฐฉ์์ ๊ณ ๋ฏผํ๊ฒ ๋๋ค(ํธ๋ฌ๋ธ ์ํ ์ ๋์) !
์ค์์จ : "๊ฐ๋ฐ ์ทจ์ ๋ ์๋๋๋ฐ .. ํผ์๋ฐฉ ์ด์ ์ํด์ ๋น์ ๋นจ๋ฆฌ ๊ฐ์์ผ์ง .. ํํ"
๊ณผ์ฐ ์ค์์จ๋ ์ด๋ป๊ฒ ์ด๋ฐ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ ์ ์์๊น?
๐๋ค์ํธ์์ ๊ณ์