[Java] μλ° λ©ν°μ°λ λ (Multi Thread)
μλ° λ©ν°μ°λ λ ꡬννκΈ°
μλ°μμ μ°λ λλ₯Ό μ΄μ©νμ¬ λΉλκΈ°λ‘ μμ μ μ²λ¦¬νλ λ°©λ²μ λν΄μ κ°λ΅νκ² ν¬μ€ν ν©λλ€.
μλ°μμ μ°λ λλ₯Ό μμ±νλ λ°©λ²μ 2κ°μ§κ° μμ΅λλ€.
첫 λ²μ§Έλ Runnable μΈν°νμ΄μ€λ₯Ό ꡬννμ¬ Thread μμ±μλ‘ ν΄λΉ ꡬν체λ₯Ό λ겨주λ λ°©λ²μ΄κ³ ,
λ λ²μ§Έλ μ§μ Thread ν΄λμ€λ₯Ό μμνλ κ²μ λλ€.
μ°μ 첫 λ²μ§Έ λ°©λ²μΌλ‘ μ°λ λλ₯Ό μμ±νμ¬ μ€ννλ μ½λλ₯Ό λ³΄κ² μ΅λλ€.
public static void main(String[] args) {
Runnable task = new Task();
Thread thread = new Thread(task);
thread.start();
}
static class Task implements Runnable {
int num = 0;
@Override
public void run() {
for(int i = 0; i < 10; i++) {
System.out.println(num++);
}
}
}
μ μ½λλ₯Ό μ€ννλ©΄ μλμ κ°μ΄ μΆλ ₯μ΄ λ©λλ€.
0
1
2
3
4
5
6
7
8
9
μ΄λ²μλ Thread ν΄λμ€λ₯Ό μμνμ¬ λμΌν μμ (task)μ νλλ‘ ν΄λ³΄κ² μ΅λλ€.
public static void main(String[] args) {
ThreadTask task = new ThreadTask();
task.run();
}
static class ThreadTask extends Thread {
int num = 0;
@Override
public void run() {
for(int i = 0; i < 10; i++) {
System.out.println(num++);
}
}
}
μ€ννλ©΄ Runnableλ‘ κ΅¬ννμ λμ λμΌνκ² μλμ κ°μ΄ μΆλ ₯μ΄ λ©λλ€.
0
1
2
3
4
5
6
7
8
9
μ°Έκ³ λ‘ μ€μ Thread ν΄λμ€λ₯Ό μ΄μ΄λ³΄λ©΄ Runnable μΈν°νμ΄μ€λ₯Ό implementνκ³ μμ΅λλ€.
public class Thread implements Runnable {
/* Make sure registerNatives is the first thing <clinit> does. */
private static native void registerNatives();
static {
registerNatives();
}
private volatile String name;
private int priority;
private Thread threadQ;
private long eetop;
.
.
.
κ·ΈλΌ μ΄λ²μλ μ°λ λ λ κ°λ₯Ό λμμ λλ €λ³΄λλ‘ νκ² μ΅λλ€.
public static void main(String[] args) {
Runnable task = new Task();
Thread thread1 = new Thread(task);
thread1.start();
System.out.println("thread 1 executed.");
Thread thread2 = new Thread(task);
thread2.start();
System.out.println("thread 2 executed.");
System.out.println("μ°λ λ μ½ μ’
λ£");
}
static class Task implements Runnable {
int num = 0;
@Override
public void run() {
for (int i = 0; i < 10; i++) {
System.out.println(Thread.currentThread().getName() + ", num=" + num++);
}
}
}
μ€κ°μ€κ°μ μ΄λ»κ² μ€νμ΄ λλμ§ νμΈμ νκΈ° μνμ¬ System.out.printlnμΌλ‘ λ‘κΉ μ ν΄λ΄€μ΅λλ€.
thread 1 executed.
Thread-0, num=0
Thread-0, num=1
Thread-0, num=2
Thread-0, num=3
Thread-0, num=4
Thread-0, num=5
thread 2 executed.
μ°λ λ μ½ μ’
λ£
Thread-0, num=6
Thread-1, num=7
Thread-1, num=9
Thread-0, num=8
Thread-1, num=10
Thread-0, num=11
Thread-1, num=12
Thread-1, num=13
Thread-1, num=14
Thread-1, num=16
Thread-1, num=17
Thread-1, num=18
Thread-1, num=19
Thread-0, num=15
BUILD SUCCESSFUL in 0s
2 actionable tasks: 1 executed, 1 up-to-date
μ μΆλ ₯ κ²°κ³Όλ₯Ό 보면 μ°λ λκ° λ¨Όμ μμλμ§λ§ "task1 executed"κ° λ¨Όμ μΆλ ₯μ΄ λμκ³ κ·Έ λ€μ 첫 λ²μ§Έ μ°λ λμΈ Thread-0μ΄ μΆλ ₯μ μμνμμ΅λλ€. κ·Έλ¦¬κ³ μ€κ°μ "task2 executed"κ° μΆλ ₯λ κ±Έ 보λ λ λ²μ§Έ μ°λ λκ° μ€νμ΄ λ κ²μ μ μ μμ£ . λ λ²μ§Έ μ°λ λλ Thread-1 μ΄λ©° 첫 λ²μ§Έ μ°λ λκ° μΌμ λ§μΉκΈ° μ μ μμλμ΄ "Thread-1, num=0"μ μΆλ ₯ν κ²μ νμΈ ν μ μμ΅λλ€.
μ΄λ κ² νλμ νλ‘μΈμ€(main νλ‘μΈμ€) μμμ μ¬λ¬ κ°μ μμ μ λμμ λλμ΄ μ€ν ν μ μλλ‘ ν΄μ£Όλ κ²μ΄ λ°λ‘ μ΄ μ°λ λμ λλ€.
μ°λ λλ‘ μμ μ νκ² λλ©΄ μλμ κ°μ νΉμ§λ€μ΄ μμ΅λλ€.
- μ¬λ¬ μμ μ λμμ μ²λ¦¬ν μ μμ΄ μμ μ μλ£νλλ° νμν μ΄ μμ μκ°μ΄ μ€μ΄λ λ€. (λ©μΈμ°λ λ 1κ°λ‘ μμ νμ λμ λΉκ΅νμ λ)
- λ¨Όμ μμν μ°λ λκ° νμ λ¨Όμ μΌμ λλ΄μ§λ μλλ€. λ°λΌμ, μμ μ μμκ° μ€μν λμλ μ°λ λλ‘ λλμ΄ μ²λ¦¬νλ©΄ μλλ€.
μ, μ΄μ μ±κΈ μ°λ λλ‘ 10μκ° κ±Έλ¦΄ μΌμ 100κ°μ μ°λ λλ₯Ό λλ €μ 10λΆλ§μ λλ΄κ³ μΆμ΅λλ€. μ΄λ»κ² ν΄μΌ ν κΉμ?
μ°λ λλ₯Ό 100κ°λ₯Ό λ§λ€μ΄μΌ νλλ° μλμ²λΌ 무μνκ² λ§λ€μ΄μΌ ν κΉμ?
Thread thread1 = new Thread(task);
Thread thread2 = new Thread(task);
Thread thread3 = new Thread(task);
Thread thread4 = new Thread(task);
Thread thread5 = new Thread(task);
.
.
.
μλλλ€. μ΄λ κ² ν΄μΌλλ©΄ μ°λ λ λ§λ€λ€κ° ν΄κ·Όν΄μΌλ©λλ€.
μλ°μμλ java.util.concurrentν¨ν€μ§μ λμμμ μ μν΄ μ μ©ν ν΄λμ€λ€μ λͺ¨μλ¨λλ° κ·Έμ€μ ThreadPoolExecutorλΌλ λ μμ΄ μμ΅λλ€. μ΄ λ μμ μ¬μ©νλ©΄ λ μΈ μ€μ΄λ©΄ 100κ°μ μ°λ λλ₯Ό λ릴 μ μλ μ½λλ₯Ό μμ±ν μ μμ£ .
ThreadPoolExecutorμ λν΄ μ€λͺ νλ €λ©΄ ν¬μ€νΈκ° κΈΈμ΄μ§λ ThreadPoolExecutorλ₯Ό μ΄μ©ν λ©ν°μ°λ λ ꡬνμ κ³μ μ΄μ΄κ°κ² μ΅λλ€.