νλ‘μΈμ€μ μ€λ λ
β³οΈ νλ‘μΈμ€
- μ΄μ체μ μμμ μ€ν μ€μΈ νλ‘κ·Έλ¨
- μ€ν μ€μΈ νλ‘κ·Έλ¨μ μΈμ€ν΄μ€
- κ° νλ‘μΈμ€λ λ 립μ μΈ λ©λͺ¨λ¦¬ 곡κ°μ κ°κ³ μμ π νλ‘μΈμ€κ° μλ‘μ λ©λͺ¨λ¦¬μ μ§μ μ κ·Ό X
- μ΄μ체μ μμ λ³λμ μμ λ¨μλ‘ λΆλ¦¬ν΄μ κ΄λ¦¬λ¨
- νλ‘μΈμ€λ νλ μ΄μμ μ€λ λλ₯Ό λ°λμ ν¬ν¨
βοΈ νλ‘μΈμ€μ λ©λͺ¨λ¦¬ ꡬμ±
- μ½λ μΉμ : μ€νν νλ‘κ·Έλ¨μ μ½λκ° μ μ₯λλ λΆλΆ
- λ°μ΄ν° μΉμ : μ μ λ³μ λ° μ μ λ³μκ° μ μ₯λλ λΆλΆ (κΈ°ν λΆλΆ)
- ν : λμ μΌλ‘ ν λΉλλ λ©λͺ¨λ¦¬ μμ
- μ€ν : λ©μλ νΈμΆ μ μμ±λλ μ§μ λ³μμ λ°ν μ£Όμκ° μ μ₯λλ μμ (μ€λ λμ ν¬ν¨)
β³οΈ μ€λ λ
- νλ‘μΈμ€ λ΄μμ μ€νλλ μμ μ λ¨μ
- ν νλ‘μΈμ€ λ΄μμ μ¬λ¬ μ€λ λ μ‘΄μ¬ κ°λ₯ π νλ‘μΈμ€κ° μ 곡νλ λμΌν λ©λͺ¨λ¦¬ κ³΅κ° κ³΅μ
βοΈ λ©λͺ¨λ¦¬ ꡬμ±
- 곡μ λ©λͺ¨λ¦¬ : κ°μ νλ‘μΈμ€μ μ½λ μΉμ , λ°μ΄ν° μΉμ , ν(λ©λͺ¨λ¦¬)μ νλ‘μΈμ€ μμ λͺ¨λ μ€λ λκ° κ³΅μ ν¨
- κ°λ³ μ€ν : κ° μ€λ λλ μμ μ μ€νμ κ°κ³ μμ
β³οΈ μλ° λ©λͺ¨λ¦¬ ꡬ쑰
- λ©μλ μμ : νλ‘κ·Έλ¨μ μ€ννλ λ° νμν κ³΅ν΅ λ°μ΄ν° κ΄λ¦¬. νλ‘κ·Έλ¨μ λͺ¨λ μμμμ 곡μ
- ν΄λμ€ μ 보 : ν΄λμ€μ μ€ν μ½λ(λ°μ΄νΈ μ½λ), νλ, λ©μλ, μμ±μ μ½λ λ± λͺ¨λ μ€ν μ½λ
- static μμ : static λ³μλ€ λ³΄κ΄
- λ°νμ μμ ν : νλ‘κ·Έλ¨μ μ€ννλ λ° νμν κ³΅ν΅ λ¦¬ν°λ΄ μμ 보κ΄
- μ€ν μμ : μ§μ λ³μ, μ€κ° μ°μ° κ²°κ³Ό, λ©μλ νΈμΆ μ 보 λ±μ ν¬ν¨
- ν μμ : κ°μ²΄(μΈμ€ν΄μ€)μ λ°°μ΄μ΄ μμ±λλ μμ. κ°λΉμ§ 컬λ μ μ΄ μ΄λ£¨μ΄μ§λ μ£Όμ μμμ΄λ©° λ μ΄μ μ°Έμ‘°λμ§ μλ κ°μ²΄λ μ κ±°λ¨
μ€λ λ μμ±νκΈ° - Thread μμ
public class HelloThread extends Thread{
@Override
public void run(){
System.out.println(Thread.currentThread().getName() + " : run()");
}
}
package thread.start;
public class HelloThreadMain {
public static void main(String[] args) {
System.out.println(Thread.currentThread().getName() + ": main() start");
HelloThread helloThread = new HelloThread();
System.out.println(Thread.currentThread().getName() + ": start() νΈμΆ μ ");
helloThread.start();
System.out.println(Thread.currentThread().getName() + ": start() νΈμΆ ν");
System.out.println(Thread.currentThread().getName() + ": main() end");
}
}
// >>> main: main() start
// >>> main: start() νΈμΆ μ
// >>> main: start() νΈμΆ ν
// >>> Thread-0: run()
// >>> main: main() end
π start() λ₯Ό νΈμΆνλ©΄ HelloThread μ€λ λκ° run() λ©μλλ₯Ό μ€ν
π μ€λ λ κ° μ€ν μμλ 보μ₯ λͺ»ν¨ (= μΆλ ₯ μμ μΌμ X)
β main μ€λ λκ° λ€λ₯Έ μ€λ λμκ² μ€ν μ§μ ν λ©μΆμ§ μκ³ κ³μ μν
- main() λ©μλλ mainμ΄λΌλ μ΄λ¦μ μ€λ λκ° μ€ν π νλ‘μΈμ€κ° μλνλ €λ©΄ μ΅μν νλλ μμ΄μΌ ν¨
- HelloThread μ€λ λ κ°μ²΄λ₯Ό μμ±ν ν start() λ©μλλ₯Ό νΈμΆνλ©΄ μλ°λ μ€λ λλ₯Ό μν λ³λμ μ€ν κ³΅κ° ν λΉ
- μ€λ λμ μ΄λ¦μ λΆμ¬νμ§ μμΌλ©΄ μλ°λ μ€λ λμ Thread-0, Thread-1κ³Ό κ°μ μμμ μ΄λ¦ λΆμ¬
- Thread-0 μ€λ λλ run() λ©μλμ μ€ν νλ μμ μ€νμ μ¬λ¦¬λ©΄μ run() λ©μλ μμ π main μ€λ λκ° run() λ©μλλ₯Ό μ€ννλ κ²μ΄ μλ !
- main μ€λ λλ λ€λ₯Έ μ€λ λμκ² μΌμ μμνλΌκ³ μ§μλ§ νκ³ start() λ©μλλ₯Ό λΉ μ Έλμ΄ π κΈ°λ€λ¦¬μ§ μμ !
- main μ€λ λμ Thread-0 μ€λ λλ λμμ μ€νλ¨
π μ€λ λ κ°μ μ€ν μμλ μΌλ§λ μ§ λ¬λΌμ§ μ μλ€ π λ©ν° μ€λ λ
λ§μ½.. start() λμ run() λ©μλλ₯Ό μ§μ νΈμΆνκ² λλ€λ©΄ ..?
- λ³λμ μ€λ λκ° run()μ μ€ννλ κ²μ΄ μλλΌ, main μ€λ λκ° run() λ©μλλ₯Ό νΈμΆ
β³οΈ λ°λͺ¬ μ€λ λ
- λ°±κ·ΈλΌμ΄λμμ 보쑰μ μΈ μμ μν
- λͺ¨λ user μ€λ λκ° μ’ λ£λλ©΄ λ°λͺ¬ μ€λ λλ μλμΌλ‘ μ’ λ£λ¨
- ex) νμΌμ΄λ λ©λͺ¨λ¦¬ μ 리νλ μμ
JVMμ λ°λͺ¬ μ€λ λμ μ€ν μλ£λ₯Ό κΈ°λ€λ¦¬μ§ μκ³ μ’ λ£λ¨.
λ°λͺ¬ μ€λ λκ° μλ λͺ¨λ μ€λ λκ° μ’ λ£λλ©΄ μλ° νλ‘κ·Έλ¨λ μ’ λ£λ¨
β³οΈ μ¬μ©μ μ€λ λ
- νλ‘κ·Έλ¨μ μ£Όμ μμ μν
- μμ μ΄ μλ£λ λκΉμ§ μ€νλ¨
- λͺ¨λ user μ€λ λκ° μ’ λ£λλ©΄ JVMλ μ’ λ£λ¨
μ€λ λ μμ±νκΈ° - Runnable μΈν°νμ΄μ€ ꡬννκΈ°
Thread ν΄λμ€λ₯Ό μμνλ λ°©μλ³΄λ€ Runnable μΈν°νμ΄μ€λ₯Ό ꡬννλ κ²μ΄ λ λμ !
public interface Runnable{
void run();
}
public class HelloRunnable implements Runnable{
@Override
public void run(){
System.out.println(Thread.currentThread().getName() + ": run()");
}
}
public class HelloRunnableMain{
public static void main(String[] args){
System.out.println(Thread.currentThread().getName() + ": main() start");
HelloRunnable runnable = new HelloRunnable();
Thread thread = new Thread(runnable);
thread.start();
System.out.println(Thread.currentThread().getName() + " : main() end");
}
}
// >>> main: main() start
// >>> main: main() end
// >>> Thread-0: run()
- μ€λ λμ ν΄λΉ μ€λ λκ° μ€νν μμ μ΄ μλ‘ λΆλ¦¬λμ΄μμ
- μ€λ λ κ°μ²΄λ₯Ό μμ±ν λ μ€νν μμ μ μμ±μλ‘ μ λ¬
β³οΈ Thread μμ vs Runnable ꡬν
- Thread ν΄λμ€ μμ λ°©μ
- Thread ν΄λμ€λ₯Ό μμλ°μ run() λ©μλλ§ μ¬μ μνλ©΄ λ¨
- μμμ μ ν μμ π μλ°λ λ¨μΌ μμλ§ νμ©νλ―λ‘ μ΄λ―Έ λ€λ₯Έ ν΄λμ€λ₯Ό μμλ°κ³ μλ κ²½μ° Thread μμ λΆκ°
- μ μ°μ± λ¨μ΄μ§
- Runnable μΈν°νμ΄μ€ ꡬν λ°©μ
- μμμ μμ λ‘μ
- μ€λ λμ μ€νν μμ μ λΆλ¦¬νμ¬ μ½λμ κ°λ μ± λμ
- μ¬λ¬ μ€λ λκ° λμΌν Runnable κ°μ²΄λ₯Ό 곡μ ν μ μμ΄ μμ κ΄λ¦¬ ν¨μ¨μ
- μ½λκ° μ½κ° 볡μ‘ν΄μ§ π Runnable κ°μ²΄λ₯Ό μμ±νκ³ μ΄λ₯Ό Threadμ μ λ¬νλ κ³Όμ μΆκ°
λ©ν°μ€λ λ νλ‘κ·Έλ¨ μμ
β³οΈ Thread μμ
1. `Thread` ν΄λμ€λ₯Ό μμλ°μ `CounterThread` λΌλ μ€λ λ ν΄λμ€λ₯Ό λ§λ€κΈ°
2. μ΄ μ€λ λλ 1λΆν° 5κΉμ§μ μ«μλ₯Ό 1μ΄ κ°κ²©μΌλ‘ μΆλ ₯ν΄μΌ ν¨. `log()` κΈ°λ₯μ μ¬μ©ν΄μ μΆλ ₯
3. `main()` λ©μλμμ `CounterThread` μ€λ λ ν΄λμ€λ₯Ό λ§λ€κ³ μ€ν
public class StartTest1Main {
public static void main(String[] args){
CounterThread thread = new CounterThread();
thread.start();
}
static class CounterThread extends Thread {
@Override
public void run(){
for(int i=1; i<=5; i++){
log("value : " + i);
try{
Thread.sleep(1000);
}catch(InterruptedException e){
throw new RuntimeException(e);
}
}
}
}
}
β³οΈ Runnable ꡬν
1. `CounterRunnable` μ΄λΌλ μ΄λ¦μ ν΄λμ€λ₯Ό λ§λ€κΈ°. μ΄ ν΄λμ€λ `Runnable` μΈν°νμ΄μ€λ₯Ό ꡬνν΄μΌ ν¨
2. `CounterRunnable` μ 1λΆν° 5κΉμ§μ μ«μλ₯Ό 1μ΄ κ°κ²©μΌλ‘ μΆλ ₯. `log()` κΈ°λ₯μ μ¬μ©ν΄μ μΆλ ₯.
3. `main` λ©μλμμ `CounterRunnable` μ μΈμ€ν΄μ€λ₯Ό μ΄μ©ν΄μ `Thread` λ₯Ό μμ±νκ³ μ€ν.
4. μ€λ λμ μ΄λ¦μ "counter"λ‘ μ§μ .
public class StartTest2Main{
public static void main(String[] args){
Thread thread = new Thread(new CounterRunnable(), "counter");
thread.start();
}
static class CounterRunnable implements Runnable{
public void run(){
for(int i=1; i<=5; i++){
log("value : " + i);
try{
Thread.sleep(1000);
}catch (InterruptedException e){
e.printStackTrace();
}
}
}
}
}
β³οΈ Runnable μ΅λͺ ν΄λμ€ κ΅¬ν
public class StartTest3Main{
public static void main(String[] args){
Runnable runnable = new Runnable(){
@Override
public void run(){
for(int i=1; i<=5; i++){
log("value : " + i);
try{
Thread.sleep(1000);
}catch (InterruptedException e){
e.printStackTrace();
}
}
}
};
Thread thread = new Thread(runnable, "counter");
thread.start();
}
}
β³οΈ μ¬λ¬ μ€λ λ μ¬μ©
Thread-A , Thread-B λ μ€λ λλ₯Ό λ§λ€κΈ°
Thread-A λ 1μ΄μ ν λ²μ© "A"λ₯Ό μΆλ ₯
Thread-B λ 0.5μ΄μ ν λ²μ© "B"λ₯Ό μΆλ ₯
κ°μ μ’ λ£ν λκΉμ§ κ³μ μ€ν.
public class StartTest4Main{
public static void main(String[] args){
Thread threadA = new Thread(new PrintWork("A", 1000), "Thread-A");
Thread threadB = new Thread(new PrintWork("B", 500), "Thread-B");
threadA.start();
threadB.start();
}
static class PrintWork implements Runnable{
private String content;
private int sleepMs;
public PrintWork(String content, int sleepMs){
this.content = content;
this.sleepMs = sleepMs;
}
@Override
public void run(){
while(true){
log(content);
try {
Thread.sleep(sleepMs);
} catch (InterruptedException e) {
throw new RuntimeException(e);
}
}
}
}
}
'Java' μΉ΄ν κ³ λ¦¬μ λ€λ₯Έ κΈ
[Java] μ§λ ¬ν Serializable (0) | 2025.03.07 |
---|---|
[Java] μ λ€λ¦ (0) | 2025.03.05 |
[Java] CompletableFuture λΉλκΈ° μμ (0) | 2024.05.06 |