μ€λ λ
μ ν리μΌμ΄μ μ μ€ννλ©΄ μ΄μ체μ λ‘λΆν° μ€νμ νμν λ©λͺ¨λ¦¬λ₯Ό ν λΉλ°λλ°,
μ€ν μ€μΈ νλμ μ ν리μΌμ΄μ μ νλ‘μΈμ€λΌ νκ³
νλ‘μΈμ€ λ΄λΆμμ μ½λμ μ€ν νλ¦μ μ€λ λλΌ νλ€.
1. λ©ν° μ€λ λ
μ΄μ체μ λ λ©ν° νμ€νΉμ ν μ μλλ‘ CPU λ° λ©λͺ¨λ¦¬ μμμ νλ‘μΈμ€λ§λ€ μ μ ν ν λΉν΄μ£Όκ³ λ³λ ¬λ‘ μ€νμν¨λ€.
μ΄λ λ©ν° νμ€νΉμ΄ κΌ λ©ν° νλ‘μΈμ€λ₯Ό λ»νλ κ²μ μλλ€. λ©ν° νλ‘μΈμ€λ νλ μ΄μμ μ ν리μΌμ΄μ μ λμμ λ³λ ¬ μ²λ¦¬νλ κ²μ λ§νλ€. νλμ μ ν리μΌμ΄μ μΌλ‘ λ©ν° νλ‘μΈμ€λ₯Ό λ§λ€κΈ°λ νλ€. μλ₯Ό λ€μ΄ μ΄λ€ μ ν리μΌμ΄μ μ 2κ° μ€ννλ€λ©΄ 2κ°μ νλ‘μΈμ€κ° μμ±λ κ²μ΄λ€.
ν νλ‘μΈμ€ λ΄μμ λ©ν° νμ€νΉμ ν μ μλλ‘ λ§λ€μ΄μ§ μ ν리μΌμ΄μ λ μλ€. λνμ μΌλ‘ λ―Έλμ΄ νλ μ΄μ΄λ λμμ μ¬μκ³Ό μμ μ¬μμ΄λΌλ λ κ°μ§ μμ μ λμμ μ²λ¦¬νλ€.
μ΄λ»κ² νλμ νλ‘μΈμ€κ° λ κ°μ§ μ΄μμ μμ μ μ²λ¦¬ν κΉ?
λ°λ‘ λ©ν° μ€λ λλ₯Ό μ΄μ©νλ©΄ λλ€. νλμ μ€λ λλ νλμ μ½λ μ€ν νλ¦μ΄κΈ° λλ¬Έμ ν νλ‘μΈμ€ λ΄μ μ€λ λκ° 2κ°λΌλ©΄ 2κ°μ μ½λ μ€ν νλ¦μ΄ μκΈ΄λ€λ μλ―Έμ΄λ€.
λ©ν° νλ‘μΈμ€λ μ΄μ체μ μμ ν λΉλ°μ μμ μ λ©λͺ¨λ¦¬λ₯Ό κ°μ§κ³ μ€ννκΈ° λλ¬Έμ κ° νλ‘μΈμ€λ λ 립μ μ΄λ€. λ°λΌμ νλμ νλ‘μΈμ€μμ μ€λ₯κ° λ°μν΄λ λ€λ₯Έ νλ‘μΈμ€μ μν₯μ λ―ΈμΉμ§ μλλ€. νμ§λ§ λ©ν° μ€λ λλ νλμ νλ‘μΈμ€ λ΄λΆμ μμ±λκΈ° λλ¬Έμ νλμ νλ‘μΈμ€κ° μμΈλ₯Ό λ°μνλ©΄ νλ‘μΈμ€ μμ²΄κ° μ’ λ£λ μ μμ΄ λ€λ₯Έ μ€λ λμ μν₯μ λ―ΈμΉκ² λλ€.
1) λ©μΈ μ€λ λ
μλ°μ λͺ¨λ μ ν리μΌμ΄μ μ λ©μΈ μ€λ λκ° main() λ©μλλ₯Ό μ€ννλ©° μμλλ€. main()μ 첫 μ½λλΆν° μλλ‘ μμ°¨μ μΌλ‘ μ€ννκ³ λ§μ§λ§ μ½λλ₯Ό μ€ννκ±°λ return λ¬Έμ λ§λλ©΄ μ€νμ΄ μ’ λ£λλ€.
λ©μΈ μ€λ λλ νμμ λ°λΌ μμ μ€λ λλ€μ λ§λ€μ΄ λ³λ ¬λ‘ μ½λλ₯Ό μ€νν μ μλ€. μ¦, λ©ν° μ€λ λλ‘ λ©ν° νμ€νΉμ μνν μ μλ€. λ©ν° μ€λ λ μ ν리μΌμ΄μ μμλ μ€ν μ€μΈ μ€λ λκ° νλλΌλ μλ€λ©΄ νλ‘μΈμ€λ μ’ λ£λμ§ μλλ€.
2) μμ μ€λ λ μμ±κ³Ό μ€ν
λ©μΈ μ€λ λλ λ°λμ μ‘΄μ¬νκΈ° λλ¬Έμ λ©μΈ μμ μ΄μΈμ μΆκ°μ μΈ λ³λ ¬ μμ μ μλ§νΌ μ€λ λλ₯Ό μμ±νλ€.
Thread thread = new Thread(); // μμ
μ€λ λ μμ±
thread.start(); // μμ
μ€λ λ μ€ν
// 1. Thread ν΄λμ€λ‘λΆν° μ§μ μμ±
// Runnableμ μμ
μ€λ λκ° μ€νν μ μλ μ½λλ₯Ό κ°μ§κ³ μλ κ°μ²΄λ‘
// μΈν°νμ΄μ€ νμ
μ΄κΈ° λλ¬Έμ ꡬν κ°μ²΄λ₯Ό λ§λ€μ΄ λμ
ν΄μΌ νλ€.
// 1) Runnable ꡬν ν΄λμ€
class Task implements Runnable {
public void run() {
// μ€λ λκ° μ€νν μ½λ
}
}
Runnable task = new Task();
Thread thread = new Thread(task);
// 2) μ΅λͺ
ꡬν κ°μ²΄
Thread thread = new Thread(new Runnable() {
public void run() {
// μ€λ λκ° μ€νν μ½λ
}
});
// 2. Thread νμ ν΄λμ€λ‘λΆν° μμ±
// Thread ν΄λμ€λ₯Ό μμν ν run() λ©μλλ₯Ό μ¬μ μνλ€.
// 1) νμ ν΄λμ€
class WorkerThread extends Thread {
@override
public void run() {
// μ€λ λκ° μ€νν μ½λ
}
}
Thread thread = new WorkerThread();
// 2) μ΅λͺ
μμ κ°μ²΄
Thread thread = new Thread {
public void run() {
// μ€λ λκ° μ€νν μ½λ
}
});
3) λκΈ°ν λ©μλ
λ©ν° μ€λ λ νλ‘κ·Έλ¨μμλ μ€λ λλ€μ΄ κ°μ²΄λ₯Ό 곡μ ν΄μ μμ ν΄μΌ νλ κ²½μ°κ° μλ€. μ΄λ, μ€λ λκ° μ¬μ© μ€μΈ κ°μ²΄λ₯Ό λ€λ₯Έ μ€λ λκ° λ³κ²½ν μ μλλ‘ μ€λ λ μμ μ΄ λλ λκΉμ§ κ°μ²΄μ μ κΈμ κ±Έμ΄μ λ€λ₯Έ μ€λ λκ° μ¬μ©ν μ μλλ‘ ν΄μΌ νλ€.
λκΈ°ν λ©μλ(synchronized)λ λ©μλ μ 체 λ΄μ©μ΄ μκ³ μμμ΄λ€.
- λκΈ°ν λ©μλλ₯Ό μ€ννλ μ¦μ μ κΈμ΄ μΌμ΄λκ³ μ€λ λκ° λκΈ°ν λ©μλλ₯Ό μ€ν μ’ λ£νλ©΄ μ κΈμ΄ νλ¦°λ€.
- λκΈ°ν λ©μλκ° μ¬λ¬ κ° μμ κ²½μ°, μ€λ λκ° μ΄λ€ μ€ νλλ₯Ό μ€νν λ λ€λ₯Έ μ€λ λλ ν΄λΉ λ©μλλ λ¬Όλ‘ μ΄κ³ λ€λ₯Έ λκΈ°ν λ©μλλ μ€νν μ μλ€.
- λ€λ₯Έ μ€λ λλ μ¬μ© μ€μΈ μ€λ λκ° μ κΈμ ν΄μ ν λκΉμ§ λκΈ°ν΄μΌ νλ€.
public synchronized void method(){
// μκ³ μμ: λ¨ νλμ μ€λ λλ§ μ€ν
}
2. μ€λ λ μ μ΄
1) μ€λ λ μν
- μ€λ λ κ°μ²΄λ₯Ό μμ±νκ³ start() λ©μλλ₯Ό νΈμΆνλ©΄ λ°λ‘ μ€νλλ κ²μ΄ μλλΌ μ€ν λκΈ° μνκ° λλ€.
- μ΄λ μ΄μ체μ λ μ€ν λκΈ° μνμ μλ μ€λ λ μ€μμ νλλ₯Ό μ νν΄ μ€ν μνλ‘ λ§λ λ€.
- μ€ν μνμ μ€λ λλ run() λ©μλλ₯Ό λͺ¨λ μ€ννκΈ° μ μ λ€μ μ€ν λκΈ° μνλ‘ λμκ° μ μλ€.
- μ€ν μνμμ run() λ©μλμ λ΄μ©μ΄ λͺ¨λ μ€νλλ©΄ μ€λ λμ μ€νμ΄ λ©μΆκ³ μ’ λ£ μνκ° λλ€.
2) μ€λ λ μν μ μ΄
λ©μλλ₯Ό ν΅ν΄ μ€ν μ€μΈ μ€λ λμ μνλ₯Ό λ³νμν¬ μ μλ€.
- interrupt(): μΌμ μ μ§ μνμ μ€λ λμ InterruptedExceptionμ λ°μμμΌ μμΈ μ²λ¦¬ μ½λμμ μ€ν λκΈ° μνλ μ’ λ£ μνλ‘ λ³κ²½νλ€.
- sleep(long millis): μ£Όμ΄μ§ μκ° λμ μ€λ λλ₯Ό μΌμ μ μ§ μνλ‘ λ§λ€κ³ μκ°μ΄ μ§λλ©΄ μ€ν λκΈ° μνκ° λλ€.
- stop(): μ€λ λλ₯Ό μ¦μ μ’ λ£νλ€. λΆμμ μ’ λ£λ₯Ό μ λ°νλ―λ‘ μ¬μ©νμ§ μλ κ²μ΄ μ’λ€.
// 1. stop νλκ·Έ μ΄μ©
public class EXThread extends Thread {
private boolean stop;
public void setStop(boolean stop) {
this.stop = stop;
}
public void run() {
while(!stop) {
System.out.println("μ€ν μ€");
}
System.out.println("μμ μ 리");
System.out.println("μ€ν μ’
λ£");
}
}
exThread.setStop(true);
// 2. interrupt() μ΄μ©
// λ¨, μΌμ μ μ§ μνκ° λμ§ μμΌλ©΄ μλ―Έκ° μλ€.
public class EXThread extends Thread {
public void run() {
try {
while(true) {
System.out.println("μ€ν μ€");
Thread.sleep(1);
}
} catch(InterruptedException e) {}
System.out.println("μμ μ 리");
System.out.println("μ€ν μ’
λ£");
}
}
exThread.interrupt();