πToday...
νλ‘μΈμ€μ μ€λ λκ° κ°μ λ»μ΄λΌκ³ μκ°ν΄μμλλ° μ΄λ²μ μ°Ύμ보면μ λμ μ°¨μ΄μ μ λν΄μ μκ²λμλ€. μλ°μ κ°λ μ 곡λΆνλ κ³Όμ μ΄μ¬μ μμΈνκ² λ€λ£¨μ§λ λͺ»νμ§λ§ μκ°μ΄ λ λ νλ²λ μμΈνκ² κ³΅λΆν΄λ΄μΌκ² λ€.
βμ€λμ TIL(Today I Learn)
μ€λ λλ?
νλ‘μΈμ€ : μ€νμ€μΈ μ ν리μΌμ΄μ (λ°μ΄ν° + μ»΄ν¨ν°μμ + μ€λ λ)
μ€λ λ : μ½λμ μ€ν νλ¦
μΌλ°μ μΌλ‘ ννλ‘κ·Έλ¨μ νλμ μ€λ λλ₯Ό κ°μ§κ³ μμ§λ§, λ μ΄μμ μ€λ λλ₯Ό λμμ μ€ννλ κ²λ κ°λ₯νλ€. μ΄λ° λ°©μμ λ©ν° μ€λ λλΌκ³ νλ€. λ©ν°νλ‘μΈμ€λ κ° νλ‘μΈμ€κ° λ 립μ μΌλ‘ μ€νλλ©° κ°κ° λ³κ°μ λ©λͺ¨λ¦¬λ₯Ό μ°¨μ§νμ§λ§, λ©ν°μ€λ λλ νλ‘μΈμ€ λ΄μ λ©λͺ¨λ¦¬λ₯Ό 곡μ ν΄μ μ¬μ©νλ€. λ¨ λ©ν°μ€λ λλ μ΄λ€κ²μ΄ λ¨Όμ μ€νλ μ§ μμλ₯Ό μμκ° μλ€.
# μ€λ λμ μ’ λ₯
1. μ¬μ©μ λ 벨 μ€λ λ(User-Level Thread) : μ¬μ©μ λ 벨μ λΌμ΄λΈλ¬λ¦¬λ₯Ό ν΅ν΄ ꡬνλλ€. λμΌν λ©λͺ¨λ¦¬ μμμμ μ€λ λκ° μμ± λ° κ΄λ¦¬λμ΄ μλκ° λΉ λ₯΄λ€.
2. 컀λ λ 벨 μ€λ λ(Kernel-Level Thread) : μ΄μ체μ κ° μ§μνλ μ€λ λκΈ°λ₯μΌλ‘ ꡬμ±. 컀λμ΄ μ€λ λμ μμ± λ° μ€μΌμ€λ§ λ±μ κ΄λ¦¬νλ€.
# λ©ν°μ€λ λ λͺ¨λΈ
1. Many to One Model
2. One to One Model
3. Many to Many Model
μ€λ λ μμ± / μ€ν
μλ°μμλ κΈ°λ³Έμ μΌλ‘ Main Threadκ° λ¨Όμ μ€νλλ€. μμ±μμ main λ©μλκ° μμ±λμΌ μ€νμ΄ κ°λ₯νκ² μ΄μ λ₯Ό μ¬κΈ°μ μμμλ€. main μ΄μΈμ μ€λ λλ₯Ό μμ±νκ³ μ€ννλ λ°©λ²μ 2κ°μ§μΈλ° ꡬλΆνλ©΄ λ€μκ³Ό κ°λ€.
# Runnable μΈν°νμ΄μ€ ꡬνν κ°μ²΄μμ run()
public class ThreadExample1 {
public static void main(String[] args) {
Runnable runnable = new ThreadExample(); //Runnableμ ꡬνν κ°μ²΄ μμ±
Thread thread1 = new Thread(runnable); //μ€λ λλ₯Ό μμ±νμ¬ κ°μ²΄λ₯Ό λ΄λλ€.
// μμ
μ€λ λλ₯Ό μ€ν, run() λ΄λΆμ μ½λλ₯Ό μ²λ¦¬
thread1.start();
}
}
class ThreadExample implements Runnable { //Runnable μΈν°νμ΄μ€ ꡬν
public void run() {
for (int i = 0; i < 100; i++) {
System.out.print("#");
}
}
# Thread ν΄λμ€λ₯Ό μμλ°μ νμν΄λμ€μμ run()
public class ThreadExample2 {
public static void main(String[] args) {
ThreadTask2 thread2 = new ThreadTask2(); //Threadλ₯Ό μμλ°λ ThreadExample κ°μ²΄λ₯Ό μμ±
// μμ
μ€λ λλ₯Ό μ€ν, run() λ΄λΆμ μ½λλ₯Ό μ²λ¦¬
thread2.start();
}
}
class ThreadExample extends Thread {
public void run() {
for (int i = 0; i < 100; i++) {
System.out.print("#");
}
}
}
# μ΅λͺ κ°μ²΄λ₯Ό ꡬννμ¬ μ€λ λ μμ± / μ€ν
public class ThreadExample1 {
public static void main(String[] args) {
// μ΅λͺ
Runnable ꡬν κ°μ²΄λ₯Ό νμ©νμ¬ μ€λ λ μμ±
Thread thread1 = new Thread(new Runnable() {
public void run() {
for (int i = 0; i < 100; i++) {
System.out.print("#");
}
}
});
//μ΅λͺ
Thread νμ κ°μ²΄λ₯Ό νμ©νμ¬ μ€λ λ μμ±
Thread thread2 = new Thread() {
public void run() {
for (int i = 0; i < 100; i++) {
System.out.print("#");
}
}
};
thread1.start();
thread2.start();
}
}
λ€μκ³Ό κ°μ΄ μ΅λͺ κ°μ²΄λ₯Ό νμ©νμ¬ νλ²μ μμ±λ κ°λ₯νλ€.
μ€λ λ μ΄λ¦ μ€μ
# μ€λ λ μ΄λ¦ μ‘°ν λ° μ€μ
public class Exam_ThreadBlog {
public static void main(String[] args) {
Thread thread = new Thread(new Runnable() {
public void run() {
System.out.println("thread control");
System.out.println(Thread.currentThread().getName()); //μ€λ λ μΈμ€ν΄μ€μ μ£Όμμ»κΈ°
}
});
thread.start();
System.out.println(Thread.currentThread().getName());
System.out.println("thread.getName() = " + thread.getName()); //μ€λ λμ μ΄λ¦ μ»κΈ°
thread.setName("changed_name_thread"); //μ€λ λ μ΄λ¦ μ€μ
System.out.println("thread4.getName() = " + thread.getName());
}
}
μΆλ ₯
μ€λ λ λκΈ°ν
λ©ν° μ€λ λ νλ‘μΈμ€μ κ²½μ°, μ¬λ¬κ°μ μ€λ λκ° κ°μ λ°μ΄ν°λ₯Ό 곡μ νκ² λμ΄ λ¬Έμ κ° λ°μν μμλ€. μ΄λ₯Ό λ°©μ§νλκ²μ΄ μ€λ λ λκΈ°νμ΄λ€.
# μκ³μμ(Critical section)
μκ³μμμ μ€λ‘μ§ νλμ μ€λ λλ§ μ½λλ₯Ό μ€ν ν μμλ μ½λ μμμ μλ―Ένλ€.
# λ½(Lock)
λ½μ μκ³μμμ ν¬ν¨νκ³ μλ κ°μ²΄μ μ κ·Όν μ μλ κΆνμ μλ―Ένλ€.
μκ³μμμΌλ‘ μ€μ λ κ°μ²΄κ° λ€λ₯Έ μ€λ λμ μν μμ μ΄ μ§νλκ³ μμ§ μμλ, λ€λ₯Έ μ€λ λκ° ν΄λΉ κ°μ²΄μ λν λ½μ νλνκ³ μκ³μμ λ΄λΆμ μ½λλ₯Ό μ€νν μμλ€. λκΈ°νλ₯Ό μ¬μ©νλ λ°©λ²μ μ¬λ¬κ°μ§κ° μλ€. νμ§λ§ μ¬κΈ°μλ synchronizedλ§ μ¬μ©νμ¬ νμΈν΄λ³΄μ.
1. λ©μλ μ 체λ₯Ό μκ³μμμΌλ‘ μ§μ
class Example {
...
public synchronized boolean example(int some) { //synchronized μ¬μ©
...
}
}
λ©μλ λ°ννμ μ μ’μΈ‘μ synchronized ν€μλλ₯Ό μμ±νλ©΄ λ©μλ μ 체λ₯Ό μκ³μμμΌλ‘ μ€μ μ΄ κ°λ₯νλ€. μ΄λ κ² μ¬μ©νλ©΄ λ©μλλ₯Ό μ€νν λ μ€λ λλ λ©μλκ° ν¬ν¨λ κ°μ²΄μ λ½μ μ»λλ€.
2. νΉμ ν μμμ μκ³μμμΌλ‘ μ§μ
class Example {
...
public boolean example(int some) {
synchronized (this) { // synchronized ν€μλμ ν¨κ» μκ΄νΈ μμ ν΄λΉμμμ΄ ν¬ν¨λ κ°μ²΄ μ°Έμ‘°λ₯Ό λ£μ
... // κ·Έλ¦¬κ³ μ€κ΄νΈλ₯Ό μ΄μ΄ λΈλ‘μ μ½λλ₯Ό μμ±
}
...
}
}
}
μ΄λ κ² μ¬μ©νκ² λλ©΄ μκ³μμμΌλ‘ μ€μ ν λΈλ‘μ μ½λκ° μ€ννλ¦μ μ§μ ν λ λΈλ‘μμ μ½λλ₯Ό μ€ννκ³ μλ μ€λ λκ° thisμ ν΄λΉνλ κ°μ²΄μ λ½μ μ»κ³ , λ°°νμ μΌλ‘ μκ³μμ λ΄μ μ½λλ₯Ό μ€ννλ€.
μ€λ λ μν
thread.start() //κ°μ²΄ μ€νλκΈ°
try { Thread.sleep(500); } catch (Exception error) {} //500 millisecondλμ λ©μΆκΈ°
thread.interrupt() // μΌμμ μ§ => μ€νλκΈ° λ³κ²½
thread.yield() //λ€λ₯Έμ€λ λμ μ€νμ μ보
thread.join() //μΌμμ€μ§ μνλ‘ λ§λ λ€.
notify() // μ€νλκΈ°λ‘ λ³κ²½
wait() // μΌμ μ μ§
// notify()μ wait()λ κ΅λλ‘ μμ
μ μ²λ¦¬ν΄μΌλ λ μ¬μ©
πνΌμμ ν΄κ²°νκΈ°
1. μ€λ λ κ°λ μ’λ μ΄ν΄λ³΄κΈ°
2. synchronized λ§κ³ μ°Έκ³ ν κ² μμκΉ?