[μλ° μΈμ΄λ‘ λ°°μ°λ λμμΈ ν¨ν΄ μ λ¬Έ] λμλ₯Ό μ½κ³ 곡λΆν λ΄μ©μ λλ€.
UML (Undefined Modeling Language)
μμ€ν μ μμννλ λ°©λ²μ΄λ μ€κ³λ₯Ό λ¬ΈμννκΈ° μν νν λ°©λ² (ex. ν΄λμ€ λ€μ΄μ΄κ·Έλ¨)
μ°λ λ (Thread)
νλ‘κ·Έλ¨μ μ€ννκ³ μλ 주체
μ±κΈ μ°λ λ νλ‘κ·Έλ¨ (Single Thread Program)
νλ‘κ·Έλ¨ μ²λ¦¬κ° νλμ νλ¦μΌλ‘ μ΄μ΄μ§λ νλ‘κ·Έλ¨
μ΄λ€ μμ μ μ€νλκ³ μλ μ²λ¦¬λ νλμ΄λ€.
λ©μΈ μ°λ λ (Main Thread)
λͺ λ Ήμ΄ μ€μμ μ§μ ν ν΄λμ€μ main λ©μλλ₯Ό μ€ν
λ©ν° μ°λ λ νλ‘κ·Έλ¨ (Multithreaded Program)
볡μμ μ°λ λκ° λμνλ νλ‘κ·Έλ¨ (μλ°λ default λ‘ λ©ν° μ°λ λ μ μ©λμ΄ μλ€.)
Thread ν΄λμ€
- run λ©μλ : μλ‘μ΄ μ°λ λκ° κΈ°λλλ©΄ run λ©μλ νΈμΆ
public class PrintThread extends Thread {
private String msg;
public PrintThread(String msg){
this.msg = msg;
}
public void run() {
for (int i = 0; i< 10000; i++){
System.out.print(msg);
}
}
}
- start λ©μλ : μλ‘μ΄ μ°λ λ κΈ°λ
public class Main {
public static void main(String[] args){
MyThread t = new MyThread();
t.start();
for(int i = 0; i < 10000; i++){
System.out.print("Good!");
}
}
}
μ°λ λ κΈ°λ λ°©λ²
- Thread ν΄λμ€μ μλΈ ν΄λμ€ (run, start) μΈμ€ν΄μ€λ₯Ό μ¬μ© (μμ μμ μ°Έκ³ )
- Runnable μΈν°νμ΄μ€μ ꡬν ν΄λμ€ μΈμ€ν΄μ€λ₯Ό μ¬μ©
Thread μλΈ ν΄λμ€ μ¬μ©
public class Main {
public static void main(String[] args){
new PrintThread("Good!").start();
new PrintThread("Nice!").start();
}
}
- start λ©μλλ₯Ό νΈμΆνκΈ° μ κΉμ§λ μΈμ€ν΄μ€λ λ§λ€μ΄μ§κ³ μλλΌλ μ°λ λλ κΈ°λνμ§ μλλ€.
Runnable μΈν°νμ΄μ€ μ¬μ©
public interface Runnable {
public abstract void run();
}
public class Printer implements Runnable {
private String msg;
public Printer(String msg){
this.msg = msg;
}
public void run() {
for (int i = 0; i < 10000; i++){
System.out.print(msg);
}
}
}
public class Main {
public static void main(String[] args){
new Thread(new Printer("Good!")).start();
new Thread(new Printer("Nice!")).start();
}
}
- Runnable μΈν°νμ΄μ€μμ run λ©μλ ꡬν
- Printer ν΄λμ€μμ Runnable μΈν°νμ΄μ€λ₯Ό μ°Έμ‘°νμ¬ run λ©μλλ₯Ό μμ±νκ³ start λ©μλλ‘ μ°λ λ κΈ°λ
Thread μΌμ μ μ§
sleep λ©μλ
- Thread.sleep(1000) : μ½ 1000 λ°λ¦¬ μ΄ (= 1μ΄) κ° νμ¬ μ°λ λ μΌμ μ μ§
- try-catch λ¬Έ μμμ μ¬μ© -> interruptedException μμΈ μ²λ¦¬
- interruptedException : μ°λ λ μ²λ¦¬λ₯Ό μ·¨μνκΈ° μν΄μ μ°μ΄λ μμΈ μ²λ¦¬
Thread λ°°ν μ μ΄
μ°λ λ A μ μ°λ λ B κ° λ³νν΄μ λμνλ κ²½μ°, μ°λ λ A μ μ²λ¦¬ μ¬μ΄μ μ°λ λ B μ μ²λ¦¬κ° λΌμ΄λ€κ² λ κ°λ₯μ±μ΄ μλ€.
μ΄λ λ― νλμ μ°λ λκ° μ΄λ€ μ²λ¦¬λ₯Ό μ€ννκ³ μμ λ λ€λ₯Έ μ°λ λλ κ·Έ λΆλΆμ μ€νν μ μλλ‘ μ μ΄ν νμκ° μλλ° μ΄λ₯Ό λ°°ν μ μ΄ (μνΈ λ°°ν, synchronized) λΌκ³ νλ€.
synchronized λ©μλ (= λκΈ° λ©μλ)
λ©μλμ synchronized λ₯Ό λΆμ¬μ μ μΈνλ©΄ ν΄λΉ λ©μλλ νλμ μ°λ λλ‘ λμνκ² λλ€.
ν λ²μ νλμ μ°λ λλ§ μ€νμν¬ μ μλ€.
public class Bank {
private int money;
private String name;
public Bank(String name, int money){
this.name = name;
this.money = money;
}
// μ
κΈ
public synchronized void deposit(int m){
money += m;
}
// μΆκΈ
public synchronized boolean withdraw(int m){
if (money >=m ){
money -= m;
return true; // μΈμΆ κ°λ₯
} else {
return false; // μΈμΆ λΆκ° (μκ³ λΆμ‘±)
}
}
public String getName(){
return name;
}
}
- deposit λ©μλμ withdraw λ©μλλ synchronized λ©μλλ‘ ν λ²μ νλμ μ°λ λλ§ μ€νκ°λ₯νλ―λ‘ νμ¬ μ€νλκ³ μλ μ°λ λκ° μμΌλ©΄ λ€λ₯Έ μ°λ λλ λκΈ°ν΄μΌ νλ€. (μ°λ λκ° μ€νμ μλ£ν λκΉμ§ synchronized λ©μλμ λ½μ΄ κ±Έλ¦°λ€.)
- synchronized κ° μλ λ©μλμ κ΄ν΄μλ λμμ λ κ° μ΄μμ μ°λ λλ₯Ό μ€νν μ μλ€.
synchronized ν ν΄λμ€ λ©μλ / synchronized λΈλ‘
// synchronized ν μΈμ€ν΄μ€ λ©μλ (λΈλ‘)
class Something {
static synchronized void method() {
...
}
}
class Something {
void method() {
synchronized (this){
...
}
}
}
// synchronized ν΄λμ€ λ©μλ
class Something {
static void method() {
synchronized (Something.class){
...
}
}
}
- synchronized ν μΈμ€ν΄μ€ λ©μλμμλ μ°λ λμ λ°°ν μ μ΄λ₯Ό μν΄ this μ λ½μ΄ μ¬μ©λλ€.
- synchronized ν΄λμ€ λ©μλμμλ μ°λ λμ λ°°ν μ μ΄λ₯Ό μν΄ ν΄λΉ ν΄λμ€μ ν΄λμ€ κ°μ²΄ λ½μ΄ μ¬μ©λλ€.
Thread μ νμ‘°
wait μ (μ°λ λ λν©μ€)
- ν΄λΉ μΈμ€ν΄μ€μ wait λ©μλλ₯Ό μ€νν ν λμμ μ μ§νκ³ μλ μ°λ λμ μ§ν©
- λͺ¨λ μΈμ€ν΄μ€λ wait μ μ κ°μ§λ€.
- wait λ©μλλ₯Ό μ€ννλ©΄ λμμ μΌμμ μ§ ν μ°λ λκ° wait μ μ λ€μ΄κ°μ 무μΈκ° λ°μνκΈ° μ κΉμ§ κ³μ μλλ€.
wait λ©μλ _ μ°λ λλ₯Ό wait μ μ λ£λλ€.
// μ°λ λκ° μΈμ€ν΄μ€ obj μ wait μ
μ λ€μ΄κ°λ€. (= μ°λ λκ° obj μμμ wait νκ³ μλ€.)
obj.wait();
// μΈμ€ν΄μ€ λ©μλ μμ wait λ©μλκ° μμΌλ©΄ μ°λ λλ this μ wait μ
μ λ€μ΄κ°μ this μμ wait νκ² λλ€.
wait();
// this.wait();
- wait λ©μλλ₯Ό μ€ννκΈ° μν΄μλ μ°λ λκ° λ½μ κ°μ§κ³ μμ΄μΌ νλ€.
- κ·Έλ¬λ wait μ μ λ€μ΄κ° λ μ°λ λλ ν΄λΉ μΈμ€ν΄μ€μ λ½μ ν΄μ νλ€.
notify λ©μλ _ νλμ μ°λ λλ₯Ό wait μ μμ κΊΌλΈλ€. (κΉ¨μ΄λ€)
// obj μ wait μ
μ μλ μ°λ λ νλλ₯Ό κΊΌλΈλ€.
obj.notify();
- μ΄λ€ μΈμ€ν΄μ€μ wait μ μ μλ μ°λ λ μ€μμ νλλ₯Ό μ ννμ¬ κΊΌλΈλ€.
- notify λ©μλλ₯Ό μ€ννκΈ° μν΄ wait λ©μλμ λ§μ°¬κ°μ§λ‘ μ°λ λκ° λΆλ¬λΈ μΈμ€ν΄μ€μ λ½μ κ°μ§κ³ μμ΄μΌ νλ€.
- μμ : wait μ μμ μ°λ λ A κ° λμ΄ -> notify λ₯Ό μ€νμν¨ μ°λ λ B κ° λ½μ ν΄μ -> μ°λ λ A κ° λ½μ κ°μ§κ² λκ³ wait λ€μ μμλ‘ λμ΄κ°
notifyAll λ©μλ _ λͺ¨λ μ°λ λλ₯Ό wait μ μμ κΊΌλΈλ€. (κΉ¨μ΄λ€)
// wait μ
μ μλ λͺ¨λ μ°λ λλ₯Ό wait μ
μμ κΊΌλΈλ€.
// obj λΌλ μΈμ€ν΄μ€μ wait μ
μμ μλ μ°λ λλ€ μ μμ νλ€μ΄ κΉ¨μ΄λ€.
obj.notifyAll();
// ν΄λΉ λ©μλμ μΈμ€ν΄μ€(this) wait μ
μμ μλ μ°λ λλ€μ λͺ¨λ wait μ
μμ κΊΌλΈλ€.
notifyAll(); // this.notifyAll();
λ½μ κ°μ§κ³ μμ§ μμ μ°λ λκ° wait, notify, notifyAll λ©μλλ₯Ό λΆλ¬λ΄λ©΄?
- μμΈ java.lang.IllegalMonitorStateException μ΄ λμ Έμ§λ€.
'κΈμ°λ κΏλ² π' μΉ΄ν κ³ λ¦¬μ λ€λ₯Έ κΈ
Dev Study #4 (feat. Design Pattern) (0) | 2022.02.21 |
---|---|
Dev Study #3 (feat. Design Pattern) (0) | 2022.02.18 |
Dev Study #1 (0) | 2022.02.16 |
[Book Review] μΈμμ μ€μ μ΄λ€ (0) | 2021.10.07 |
λκΈ