-
[Java] μλ° μ°λ λ μμ±(Thread, Runnable)Android/Java 2021. 2. 2. 14:52λ°μν
- μ΄ κΈμ "μλ° μ¨λΌμΈ μ€ν°λ" 곡λΆν λ΄μ©μ μ 리νμ¬ μ΄ κΈμ λλ€.
Process vs Thread
μλ°μ μ°λ λλ₯Ό μ€λͺ νκΈ° μ΄μ μ νλ‘μΈμ€μ μ°λ λμ μ°¨μ΄μ λν΄ κ°λ΅νκ²λλ§ μ νμκ° μμ΅λλ€.
Process
νλ‘μΈμ€μ μ¬μ μ μ μλ‘λ μ€ν μ€μΈ νλ‘κ·Έλ¨μ λ»νκ² λ©λλ€.
μλμ°μμ μ μ₯μ₯μΉμ μ μ₯λ μνλ₯Ό νλ‘κ·Έλ¨μ΄λΌκ³ νκ³ λλΈν΄λ¦μ ν΅ν΄ νλ‘κ·Έλ¨μ΄ λ©λͺ¨λ¦¬ 곡κ°μ μ¬λΌμ μ€νμ€μΈ νλ‘κ·Έλ¨ μΈμ€ν΄μ€λ₯Ό νλ‘μΈμ€λΌκ³ ν©λλ€.Thread
ν νλ‘μΈμ€ λ΄μμ λμλλ μ€νλ¨μλ₯Ό λ»νκ² λ©λλ€.
ν¬λ‘¬ λΈλΌμ°μ λΌλ νλ‘μΈμ€μμ μ νλΈμ μ μνμ¬ λμμμ μμ²ν λ μ νλΈ λ°μ΄ν°λ₯Ό λ€μ΄λ‘λ λ°μΌλ©΄μ λμμμ΄ μ€νλλ μμ μ΄ λμμ μ΄λ£¨μ΄μ§λ κ²λ μ°λ λλ₯Ό ν΅ν΄ κ°λ₯νκ² λ©λλ€.Thread μμ±
- μλ°μμ Threadλ₯Ό μμ±νλ λ°©λ²μ λ κ°μ§κ° μ‘΄μ¬ν©λλ€.
- νλλ Thread ν΄λμ€λ₯Ό μμλ°μ run λ©μλλ₯Ό μ€λ²λΌμ΄λ© νλ κ²κ³Ό Runnable μΈν°νμ΄μ€λ₯Ό implements νμ¬ run λ©μλλ₯Ό μ μνλ κ²μ λλ€.
Thread ν΄λμ€
public class MyThread extends Thread{ int num; public MyThread() { this.num = 0; } public MyThread(int num) { this.num = num; } @Override public void run() { System.out.println(this.num + " thread start"); try{ Thread.sleep(1000); }catch (InterruptedException e){ e.printStackTrace(); } System.out.println(this.num +" thread end"); } }
Thread ν΄λμ€λ₯Ό μμλ°μ 컀μ€ν Thread ν΄λμ€λ₯Ό μμ±ν©λλ€. run λ©μλλ₯Ό μ€λ²λΌμ΄λ© νμ¬ μμ μ΄ μνλ μ½λλ₯Ό μ€νν μ μμ΅λλ€.
public class Main { public static void main(String[] args) { MyThread myThread = new MyThread(); myThread.start(); System.out.println("main end"); } }
μ½λ μμλλ‘λΌλ©΄ thread startμ endκ° μΆλ ₯λ μ΄νμ main endκ° μΆλ ₯λμ΄μΌ νμ§λ§ main endκ° λ¨Όμ μΆλ ₯λ λͺ¨μ΅μ νμΈν μ μμ΅λλ€.
μ¦, λ©μΈ μ°λ λμ λ€λ₯Έ μλ‘μ΄ μ°λ λκ° μμ±λμ΄ λμμ μ€νλμλ€λ κ²μ νμΈν μ μμ΅λλ€.public class Main { public static void main(String[] args) { for(int i=1;i<=10;i++){ MyThread myThread = new MyThread(i); myThread.start(); } System.out.println("main end"); } }
μ νν μ°λ λ λμμ νμΈνκΈ° μν΄ κ° μ°λ λμ λ²νΈλ₯Ό λΆμ¬μ νμΈν΄λ΄€μ΅λλ€.
λͺ¨λ μ°λ λλ€μ μμ°¨μ μΌλ‘ μ€νλλ κ²μ΄ μλλΌ λ¬΄μμλ‘ μ€νλλ μ΄μ λ λμμ μΌλ‘ μ€νλκΈ° λλ¬Έμ λλ€. Thread ν΄λμ€μμλ start λ©μλμ run λ©μλλ€μ΄ λ λ€ μ‘΄μ¬νλλ° start λ©μλλ₯Ό νΈμΆνλ©΄ μ run λ©μλκ° μ€νλλμ§λ λ€μ μ€λͺ νλλ‘ νκ² μ΅λλ€.
Runnable μΈν°νμ΄μ€
Threadλ₯Ό μμ±ν λ Thread ν΄λμ€λ₯Ό μμλ°λ λ°©λ²λ μμ§λ§ Runnable μΈν°νμ΄μ€λ₯Ό ꡬννλ λ°©λ²λ μ‘΄μ¬ν©λλ€.
@FunctionalInterface public interface Runnable { public abstract void run(); }
Runnable μΈν°νμ΄μ€λ run λ©μλλ₯Ό 무쑰건 ꡬννλΌκ³ κ°μ ν μΈν°νμ΄μ€μ λλ€.
μ°Έκ³ λ‘ @FunctionalInterfaceλ μΈν°νμ΄μ€ λ΄λΆμ λ©μλκ° 1κ° μλ€κ³ μλ €μ£Όλ λ©νλ°μ΄ν°(μ£Όμ)μ λλ€.
public class MyRunnable implements Runnable { int num; public MyRunnable() { this.num = 0; } public MyRunnable(int num) { this.num = num; } @Override public void run() { System.out.println(this.num + " thread start"); try{ Thread.sleep(1000); }catch (InterruptedException e){ e.printStackTrace(); } System.out.println(this.num +" thread end"); } }
μ΄ μΈν°νμ΄μ€λ₯Ό μ¬μ©ν MyRunnable ν΄λμ€μ λλ€.
Threadμ ν΄λμ€μ λμΌνκ² runλ©μλλ thread startμ end μμ μ μΆλ ₯νλλ‘ νμμ΅λλ€.public class Main { public static void main(String[] args) { for(int i=1;i<=10;i++){ Thread thread = new Thread(new MyRunnable(i)); thread.start(); } System.out.println("main end"); } }
Runnable μΈν°νμ΄μ€λ₯Ό ꡬνν ν΄λμ€λ Threadμ 맀κ°λ³μλ‘ λ£μ΄ Threadλ₯Ό μμ±ν μ μμ΅λλ€. μ΄ν thread.start()λ₯Ό νκ² λλ©΄ Thread ν΄λμ€μ λμΌνκ² μ°λ λκ° λμμ μ€νλλ κ²μ μ μ μμ΅λλ€.
Thread Class μ Runnable Interface λΉκ΅
Thread ν΄λμ€λ₯Ό μμνκ±°λ Runnable Interfaceλ₯Ό ꡬννμ¬ λ§λ μ€λ λλ run λ©μλ μ½λμ μ€νκ³Ό μ±λ₯μ λμΌν©λλ€. λ€λ§ ꡬνκ³Όμ μμλ§ μ°¨μ΄κ° λ©λλ€.κ°μ²΄μ§ν₯ νλ‘κ·Έλλ°μμ μμμ λΆλͺ¨μ κΈ°λ₯μ λ¬Όλ €λ°μ μ¬μ¬μ©νκ±°λ, μ¬μ μλ₯Ό νκ³ μλ‘μ΄ κΈ°λ₯λ€μ μΆκ°νμ¬ νμ₯νλ κ²μ μλ―Έν©λλ€. νμ§λ§ μλ°μ λ€μ€μμμ΄ λΆκ°λ₯μ μ μκ°νλ©΄ Thread ν΄λμ€μ run λ©μλ νλλλ¬Έμ μμκΈ°λ₯μ μ¬μ©νλ κ²μ λΉν¨μ¨μ μ λλ€.
μ΄λ₯Ό ν΄κ²°νκΈ° μν΄μ μ€λ λ μμ± μ λ°λμ ꡬνν΄μΌ νλ run λ©μλλ₯Ό Thread ν΄λμ€μ λΆλ¦¬νκ³ κ΅¬νμ κ°μ νλ μΈν°νμ΄μ€λ₯Ό μ¬μ©νλ κ²μ λλ€. μ΄κ²μ΄ λ°λ‘ Runnable μΈν°νμ΄μ€μ λλ€. λ§μ½, Thread ν΄λμ€μ λ λ€λ₯Έ κΈ°λ₯μ νμ₯νκ±°λ μ¬μ μλ₯Ό ν΄μΌν κ²½μ°λΌλ©΄ Runnable μΈν°νμ΄μ€ λμ Thread ν΄λμ€λ₯Ό μμνλκ² λ ν¨κ³Όμ μΌ μ μμ΅λλ€.
λ°λΌμ, Thread ν΄λμ€ κΈ°λ₯μ νμ₯ μ¬λΆμ λ°λΌ Thread ν΄λμ€λ₯Ό μμλ°μ κ²μΈμ§, Runnable μΈν°νμ΄μ€λ₯Ό ꡬνν κ²μΈμ§ μ νν μ μμ΅λλ€.
μ start λ©μλμΌκΉ?
μ λ μ€λ λλ₯Ό μμ±νμ¬ start λ©μλλ₯Ό νΈμΆνλλ° μ run λ©μλκ° νΈμΆλλμ§ μ΄μ κ° κΆκΈν΄μ‘μ΅λλ€.
public synchronized void start() { /** * This method is not invoked for the main method thread or "system" * group threads created/set up by the VM. Any new functionality added * to this method in the future may have to also be added to the VM. * * A zero status value corresponds to state "NEW". */ if (threadStatus != 0) throw new IllegalThreadStateException(); /* Notify the group that this thread is about to be started * so that it can be added to the group's list of threads * and the group's unstarted count can be decremented. */ group.add(this); boolean started = false; try { start0(); started = true; } finally { try { if (!started) { group.threadStartFailed(this); } } catch (Throwable ignore) { /* do nothing. If start0 threw a Throwable then it will be passed up the call stack */ } } }
λ΄λΆν¨μμ start0() λ©μλκ° μλ κ²μ νμΈν μ μμ΅λλ€. μ΄ λ©μλλ λ€μ΄ν°λΈ ν¨μλ‘ λ΄λΆμ μΌλ‘ run λ©μλλ₯Ό νΈμΆνλλ‘ κ΅¬νλμ΄ μμ΅λλ€.
λ ν¨μμ μ°¨μ΄μ μ λ§νκΈ° μ μ νλ‘μΈμ€μ λ©λͺ¨λ¦¬ ꡬ쑰μ λν΄ μμμΌ ν©λλ€.
μμ κ·Έλ¦Όμμ μΌμͺ½μ λ¨μΌ μ€λ λ νλ‘μΈμ€, μ€λ₯Έμͺ½μ λ€μ€ μ€λ λ νλ‘μΈμ€μ λλ€.- Heap : λμ μΌλ‘ μμ±νλ λ³μλ₯Ό λ΄λ λ©λͺ¨λ¦¬
- Code : μ½λ μμ λ©λͺ¨λ¦¬
- Static : μ μ λ³μ or ν΄λμ€ λ³μλ₯Ό λ΄λ λ©λͺ¨λ¦¬
- Stack : λ©μλ λ΄ μ§μ λ³μ, μμλ³μλ₯Ό λ΄λ λ©λͺ¨λ¦¬
λ€μ€ μ€λ λλ Heap, Code, Static μμμ 곡μ νμ§λ§ μ€λ λ λ³λ‘ κ°κΈ° λ€λ₯Έ Stack μμμ΄ μ‘΄μ¬ν©λλ€.
Thread ν΄λμ€μ run λ©μλλ₯Ό μ€ννλ κ²μ λ¨μν μ€λ²λΌμ΄λ©μ ν λ©μλλ₯Ό νΈμΆνλ κ²μΌ λΏμ λλ€. μ¦, λ©μΈ μ€λ λμμμ Stack μμμ μ°¨μ§ νμ¬ λ©μλκ° λλμ§ μμΌλ©΄ λ€λ₯Έ λ©μλκ° μ€νλμ§ μκΈ° λλ¬Έμ μμ°¨μ μΌλ‘ μ§νλ μ λ°μ μμ΅λλ€.νμ§λ§ start λ©μλλ₯Ό μ€ννλ κ²μ JVMμ μ€λ λλ₯Ό μν Stack μμμ μλ‘ λ§λ€κΈ° λλ¬Έμ run λ©μλ νΈμΆκ³Όλ λ€λ₯΄κ² λ 립μ μΌλ‘ λμμ΄ κ°λ₯ν©λλ€.
- μ°Έμ‘°(https://namneul.tistory.com/25)
λ°μν'Android > Java' μΉ΄ν κ³ λ¦¬μ λ€λ₯Έ κΈ
[Java] μλ° μ°λ λ κ΅μ°©μν(deadlock) (2) 2021.02.07 [Java] μλ° μ°λ λ μν, μ°μ μμ(State, Priority) (0) 2021.02.05 [Java] μλ° μμΈμ²λ¦¬ (0) 2021.02.01 [Java] μλ° μΈν°νμ΄μ€(Interface) μ¬μ© (0) 2021.01.24 [Java] μλ° ν¨ν€μ§λ? (0) 2021.01.19