μΌ | μ | ν | μ | λͺ© | κΈ | ν |
---|---|---|---|---|---|---|
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 |
- μ€λ λ
- ν°μ€ν 리μ±λ¦°μ§
- νλ μ ꡬ쑰
- λΉμ£ΌκΈ°μ νΈ
- μ€λ₯κ²μΆ
- tcp νλ‘ν μ½
- νλ‘μ΄λμμ
- tcp μΈκ·Έλ¨ΌνΈ
- i-type
- reducible
- μ°λΆν¬db
- 99ν΄λ½
- μ€λ₯μ μ΄
- ν ν° λ²μ€
- git merge
- IEEE 802
- νν΄99
- mariadb
- 그리λ μκ³ λ¦¬μ¦
- μ½λ©ν μ€νΈμ€λΉ
- μ€λΈμ
- μμλ²νΈ
- xv6
- leetcode
- κ°λ°μμ·¨μ
- well known ν¬νΈ
- μ£ΌκΈ°μ νΈ
- til
- λ°μ΄ν° μ μ‘
- μλΉμ€ ν리미ν°λΈ
- Today
- Total
UnfazedβοΈπ―
[Java] μ€λ λ μμ± λ©μ»€λμ¦κ³Ό JVMμ μ€λ λ κ΄λ¦¬ λ°©μμΌλ‘ μ΄ν΄νλ μ€λ λ start(), run() λ©μλμ μ°¨μ΄ λ³Έλ¬Έ
[Java] μ€λ λ μμ± λ©μ»€λμ¦κ³Ό JVMμ μ€λ λ κ΄λ¦¬ λ°©μμΌλ‘ μ΄ν΄νλ μ€λ λ start(), run() λ©μλμ μ°¨μ΄
9taetae9 2025. 2. 7. 15:29Javaμμ start() λ©μλλ₯Ό νΈμΆν΄μΌ νλ μ΄μ μ run() λ©μλ μ§μ νΈμΆμ λ¬Έμ μ μ μμ보μ.
1. μ€λ λ μ€ν λ©μ»€λμ¦μ ν΅μ¬ μ°¨μ΄
start() λ©μλμ μν
μλ‘μ΄ νΈμΆ μ€ν(Call Stack)μ μμ±νμ¬ JVMμ΄ ν΄λΉ μ€λ λλ₯Ό μ€μΌμ€λ§ν μ μλλ‘ μ€λΉ μνλ‘ μ ννλ€. μ΄ κ³Όμ μμ λ€μ΄ν°λΈ λ©μλ start0()κ° νΈμΆλλ©°, μ΄λ OS μμ€μμ μ€μ μ€λ λ 리μμ€λ₯Ό ν λΉνλ μν μ μννλ€.
run() μ§μ νΈμΆμ λ¬Έμ μ
νμ¬ μ€ν μ€μΈ μ€λ λμ νΈμΆ μ€νμμ λκΈ°μ μΌλ‘ μ½λκ° μ€νλλ€. μ΄λ λ¨μ λ©μλ νΈμΆκ³Ό λμΌν λ°©μμΌλ‘ μλνλ©°, λ©ν°μ€λ λ©μ ν΅μ¬μΈ λ³λ ¬ μ€νμ΄ λμ§ μλλ€.
// μλͺ»λ μ¬μ© μμ
Thread myThread = new MyCustomThread();
myThread.run(); // λ©μΈ μ€λ λμμ μμ°¨ μ€ν
2. μ€λ λ κ΄λ¦¬
μν μ μ΄ | start()νΈμΆ μ | run()μ§μ νΈμΆ μ |
NEW → RUNNABLE | O (μ€λ λ νμ λ±λ‘) | X (μν λ³ν μμ) |
λ 립μ μ€ν 컨ν μ€νΈ | O (μ μ€ν λ©λͺ¨λ¦¬ ν λΉ) | X (κΈ°μ‘΄ μ€ν μ¬μ©) |
GC κ΄λ¦¬ λμ | O (μ€ν μ’ λ£ ν μλ ν΄μ ) | X (λͺ μμ ν΄μ νμ) |
JVMμ μ€λ λ μ€μΌμ€λ¬λ start()λ₯Ό ν΅ν΄ λ±λ‘λ μ€λ λλ§μ κ΄λ¦¬ λμμΌλ‘ μΌλλ€. run() μ§μ νΈμΆ μ μ€λ λ κ°μ²΄λ μΌλ° μλ° κ°μ²΄μ λμΌνκ² μ·¨κΈλλ€.
3. λ³λ ¬μ± ν μ€νΈ
start() νΈμΆ μ
public class Main {
public static class ConcurrencyDemo {
public static void main(String[] args) {
Thread t1 = new TaskThread("T1");
Thread t2 = new TaskThread("T2");
t1.start(); // λ³λ ¬ μ€ν
t2.start();
}
}
static class TaskThread extends Thread {
public TaskThread(String name) {
this.setName(name);
}
public void run() {
IntStream.range(0, 5).forEach(i -> {
System.out.println(Thread.currentThread().getName() + " - " + i);
});
}
}
}
μμ μ½λμ μ€ν κ²°κ³Όμ κ°μ΄ μ€λ λ T1, T2μ μΆλ ₯ μμκ° λ§€ μ€νλ§λ€ λ¬λΌμ§λ κ²μ΄ μ μμ μΈ λ³λ ¬ μ€νμ κ²°κ³ΌλΌ ν μ μλ€.
run() νΈμΆ μ
κ·Έλ λ€λ©΄ run()μ μ§μ νΈμΆ μ κ²°κ³Όλ μ΄λ¨κΉ?
μ μ½λμμ start() νΈμΆ λΌμΈλ§ run()μΌλ‘ λ³κ²½νλ€ μ€νν΄λ³΄μ.
public static void main(String[] args) {
Thread t1 = new TaskThread("T1");
Thread t2 = new TaskThread("T2");
t1.run(); // λ³λ ¬ μ€ν X
t2.run();
}
μ€ν κ²°κ³Όμμ λ³Ό μ μλ―μ΄ λͺ¨λ μΆλ ₯μ΄ μμ°¨μ μΌλ‘ λ°μνλ€. μ¦, t1μ λν run() λ‘μ§μ λͺ¨λ μ€νν λ€μμΌ t2κ° μμ μ μ²λ¦¬νλ€.
μ°¨μ΄λ μ΄λΏλ§μ΄ μλλ€.
μμ start() νΈμΆ κ²°κ³Όμμ μ€νμ€μΈ μ€λ λκ° T1, T2λ‘ μΆλ ₯λλ κ²κ³Ό λ¬λ¦¬, run()νΈμΆ μμλ νμ¬ μμ μ€μΈ μ€λ λκ° mainμΌλ‘ μΆλ ₯λλ κ²μ λ³Ό μ μλ€.
μ΄λ¬ν κ²°κ³Όλ μ€ν 컨ν μ€νΈμ κ·Όλ³Έμ μ°¨μ΄μμ λΉλ‘―λλλ°, μ€λ λ μμ± λ©μ»€λμ¦κ³Ό JVMμ μ€λ λ κ΄λ¦¬ λ°©μμ λν μ΄ν΄κ° νμνλ€.
start() μ¬μ© μ
- JVMμ΄ start0() λ€μ΄ν°λΈ λ©μλλ₯Ό ν΅ν΄ OS μμ€μμ μ μ€λ λ μμ±
- μ μ€λ λμ νΈμΆ μ€νμ run() λ©μλ νλ μ μμ± //(κ° μ€λ λλ λ 립μ μΈ μ€ν 곡κ°κ³Ό Instruction Pointerλ₯Ό κ°λλ€)
- Thread.currentThread()κ° μ μ€λ λ κ°μ²΄ λ°ν
// T1 μ€λ λμ run() μ€ν 컨ν
μ€νΈ
public void run() {
System.out.println(Thread.currentThread().getName()); // "T1"
}
run() μ§μ νΈμΆ μ
- νμ¬ μ€λ λ(λ©μΈ)μ νΈμΆ μ€νμμ μ§μ μ€ν
- Thread.currentThread()λ λ©μΈ μ€λ λ κ°μ²΄ λ°ν
myThread.run(); // λ©μΈ μ€λ λ 컨ν
μ€νΈμμ μ€ν
System.out.println(Thread.currentThread().getName()); // "main"
μ 리
- μ€ν 주체μ λΆλ¦¬ : start()λ μλ‘μ΄ μ€ν 주체(μ€λ λ)λ₯Ό μμ±νμ§λ§, run() μ§μ νΈμΆμ κΈ°μ‘΄ μ€ν 주체λ₯Ό μ¬μ©νλ€.
- μ€λ λ μλ³ λ©μ»€λμ¦ : Thread.currentThread()λ νμ νμ¬ μ½λλ₯Ό μ€ν μ€μΈ μ€λ λλ₯Ό λ°ννλ€. run()μ μ§μ νΈμΆνλ©΄ νΈμΆμμ μ€λ λ(main)κ° μ€ν μ£Όμ²΄κ° λλ€.
- μ€λ λ ν΄λμ€μ run() λ©μλλ μ€νν μμ μ μ μνλ ν νλ¦Ώμ΄λ©°, start()λ μ€ν 주체 κ΄λ¦¬λ₯Ό μν λ©μ»€λμ¦μΌλ‘ μ€κ³λμλ€.
- start(): μ€ν μ€λ λ μμ± + μμ μ€ν
- run(): μμ μ€νλ§ (μ€ν 주체 λ³ν μμ)
μΆκ° - start(), run() νΈμΆ λ°©μ μμΈ λΉκ΅
- start() νΈμΆ μ
- μλ‘μ΄ μ€ν 컨ν μ€νΈ μμ±: start() λ©μλλ λ΄λΆμ μΌλ‘ λ€μ΄ν°λΈ λ©μλ start0()λ₯Ό νΈμΆνμ¬ OSμ μλ‘μ΄ μ€λ λ μμ±μ μμ²νλ€. OSλ μ΄ μμ²μ λ°λΌ μλ‘μ΄ μ€λ λ μ μ΄ λΈλ‘(TCB)μ μμ±νκ³ , JVMμ OSκ° μμ±ν TCBμ java.lang.Thread κ°μ²΄λ₯Ό λ§€ννλ€.
- λμμ± λ° λ³λ ¬ μ€ν: OS μ€μΌμ€λ¬κ° μ μ€λ λλ₯Ό Runnable μνλ‘ μ ννκ³ , μ€μΌμ€λ§μ λ°λΌ κ°κ° λ 립μ μΈ μ€λ λ(T1, T2 λ±)μμ run() λ©μλκ° μ€νλλ€. μ΄λ‘ μΈν΄ μ¬λ¬ μ€λ λκ° λ³λ ¬λ‘ μ€νλ μ μμΌλ©°, κ° μ€λ λμ μ΄λ¦μ΄ μΆλ ₯λλ κ²°κ³Όλ μλ‘ λ€λ₯΄λ€.
- run() μ§μ νΈμΆ μ
- νμ¬ μ€λ λμμ μμ°¨ μ€ν: run()μ μ§μ νΈμΆνλ©΄ μλ‘μ΄ μ€λ λλ₯Ό μμ±νμ§ μκ³ , λ¨μν μΌλ° λ©μλλ₯Ό νΈμΆνλ κ²κ³Ό λμΌνλ€. λ°λΌμ run() λ΄ λ‘μ§μ΄ νΈμΆλ μ€λ λ(λ³΄ν΅ main μ€λ λ)μμ μμ°¨μ μΌλ‘ μ€νλλ―λ‘, μ€λ λ μ΄λ¦λ λͺ¨λ mainμΌλ‘ νμλλ€.
- λ³λ ¬μ± λΆμ¬: λ³λμ μ€λ λκ° μμΌλ―λ‘ λ³λ ¬λ‘ μ¬λ¬ μμ μ΄ μ€νλμ§ μκ³ , ν μμ μ΄ λλ νμ λ€μ μμ μ΄ μ€νλλ€.
λ°λΌμ, μ€λ λλ₯Ό ν΅ν λ³λ ¬ μ²λ¦¬ λ° λμμ±μ ꡬνν λλ λ°λμ start()λ₯Ό μ¬μ©ν΄μΌ νλ€λ μ μ λͺ μ¬νμ.
μ€ν μ£ΌκΈ° κ΄λ¦¬ νλ¦ μμ½
- JVM: start0() νΈμΆ → OS μ€λ λ μμ± μμ²
- OS: μ€λ λ TCB(Thread Control Block) μμ±
- JVM: java.lang.Thread κ°μ²΄μ OS μ€λ λ λ§€ν
- OS μ€μΌμ€λ¬: Runnable μνλ‘ μ ν
- JVM: run() λ©μλ νΈμΆ μμ
- μ€ν μλ£ ν OS 리μμ€ λ°ν
μ©μ΄ μ 리
- TCB : OSκ° κ° μ€λ λλ₯Ό κ΄λ¦¬νκΈ° μν΄ μ μ§νλ λ°μ΄ν° κ΅¬μ‘°λ‘ μ€λ λμ μ€ν 컨ν μ€νΈμ μν, μ€νλ₯Ό μ μ₯
- μ€ν 컨ν
μ€νΈ : νΉμ μμ μ μ€λ λκ° μμ
μ μννκΈ° μν΄ νμν λͺ¨λ μν μ 보 (OSκ° μ€λ λλ₯Ό μ€λ¨νλ€κ° λ€μ μ€νν λ μ νν μ€λ¨λ μ§μ λΆν° μ¬κ°ν μ μλλ‘ ν¨)
- μ€λ λμ μ€ν 컨ν μ€νΈ ν΅μ¬ κ΅¬μ± μμ : νλ‘κ·Έλ¨ μΉ΄μ΄ν°, μ€ν λ©λͺ¨λ¦¬, CPU λ μ§μ€ν° μν, μ€λ λ μν, μ°Έμ‘° 리μμ€
μ°Έκ³ μλ£:
https://www.simplilearn.com/tutorials/java-tutorial/thread-in-java
Java Threads: Thread Life Cycle and Threading Basics
Learn about threads in Java, threading basics, and thread life cycle stages. Understand how Java threads enable multitasking and efficient program execution.
www.simplilearn.com
λ©ν° μ€λ λβ—β1. μλ°μμ μ€λ λμ μμ±κ³Ό μμ, κ·Έλ¦¬κ³ μλ° μ€λ λμ os μ€λ λ λ§΅ν
νλ‘μΈμ€μ μ€λ λ
hello-woody.medium.com
'Java' μΉ΄ν κ³ λ¦¬μ λ€λ₯Έ κΈ
[Java] μ¬λ°λ₯Έ Optional μ¬μ©μΌλ‘ API μ€κ³νκΈ° (0) | 2025.02.26 |
---|---|
[Java] null μ°Έμ‘°λ‘ μΈν΄ λ°μνλ λ¬Έμ (0) | 2025.02.14 |
[Java] μ€λ λ μ’ λ£ & Daemon μ€λ λ (0) | 2025.02.06 |
[Java] μ€λ λ μμ± (Runnable μΈν°νμ΄μ€ ꡬν, Thread ν΄λμ€ μμ) (0) | 2025.02.06 |
[Java] μ€λ λμ κΈ°λ₯κ³Ό λλ²κΉ (0) | 2025.02.06 |