-
[Java] ์๋ฐ ์ฐ๋ ๋ ์ํ, ์ฐ์ ์์(State, Priority)Android/Java 2021. 2. 5. 02:19๋ฐ์ํ
- ์ด ๊ธ์ "์๋ฐ ์จ๋ผ์ธ ์คํฐ๋" ์ ์ฐธ์ฌํ์ฌ ๊ณต๋ถํ ๊ธ์ ๋๋ค.
๋ฉํฐ ์ฐ๋ ๋
-
๋ฉํฐ ์ฐ๋ ๋ ํ๋ก๊ทธ๋๋ฐ์ด๋ ํ๋์ ์์ฉํ๋ก๊ทธ๋จ์์ ๋์์ ์ฌ๋ฌ ์ฒ๋ฆฌ๋ฅผ ํ๊ธฐ ์ํด ์ฐ๋ ๋๋ฅผ ์์ฑํ์ฌ ์ด์ํ๋ ํ๋ก๊ทธ๋๋ฐ์ ๋งํฉ๋๋ค.
-
๋ฉํฐ ์ฐ๋ ๋ ํ๋ก๊ทธ๋๋ฐ์ ํน์ง์ ๋์์ฑ๊ณผ ๋ณ๋ ฌ์ฑ์ด ์กด์ฌํฉ๋๋ค. ํ๋์ ์ฝ์ด์์ ์ฌ๋ฌ ๊ฐ์ ์ฐ๋ ๋๋ฅผ ์ด์ํ๋ ๊ฒ์ ๋์์ฑ์ผ๋ก ๋น ๋ฅธ ์๋๋ก ์ฐ๋ ๋๋ฅผ ๋ฒ๊ฐ์ ๊ฐ๋ฉด์ ์คํํ๋ ๊ฒ์ ๋๋ค.
-
๋ณ๋ ฌ์ฑ์ ๋ค์์ ์ฝ์ด์์ ๊ฐ ์ฝ์ด์ ์ฐ๋ ๋๋ฅผ ์์ฑํ์ฌ ์คํ์ํค๋ ๊ฒ์ ๋๋ค.
์๋ฐ ์ฐ๋ ๋ ์ํ (Thread State)
์๋ฐ ๋ฉํฐ ์ฐ๋ ๋ ํ๋ก๊ทธ๋๋ฐ์ ํ๋ฉด ๋๊ธฐํ/๋น๋๊ธฐํ ๋ฟ๋ง ์๋๋ผ ์ฐ๋ ๋ ์ํ๋ฅผ ์ง์ ์ ์ดํ ๊ฒฝ์ฐ๋ ์๊น๋๋ค.
์ฐ๋ ๋ ์ ์ดํ๊ธฐ ์ ์ ์ฐ๋ ๋์ ์ํ๋ก ์์์ผ ํ๋๋ฐ getState() ๋ฉ์๋๋ฅผ ํตํด ์ ์ ์์ต๋๋ค.-
๊ฐ์ฒด ์์ฑ (NEW) : start() ๋ฉ์๋๊ฐ ํธ์ถ๋์ง ์์ ์ํ๋ก ์ค๋ ๋ ๊ฐ์ฒด๋ฅผ ์์ฑ.
-
์คํ ๋๊ธฐ (RUNNABLE) : ์คํ์ ๋๊ธฐํ๋ ์ํ, ์ธ์ ๋ ์คํ ์ํ๋ก ๊ฐ ์ ์์.
-
์ผ์ ์ ์ง (WAITING) : ๋ค๋ฅธ ์ค๋ ๋๊ฐ ํต์งํ ๋๊น์ง ๊ธฐ๋ค๋ฆฌ๋ ์ํ
-
์ผ์ ์ ์ง (TIMED_WAITING) : ์ฃผ์ด์ง ์๊ฐ๋์ ๊ธฐ๋ค๋ฆฌ๋ ์ํ
-
์ผ์ ์ ์ง (BLOCKED) : ๋๊ธฐํ๋ก ์ธํด ์ฌ์ฉํ๊ณ ์ ํ๋ ๊ฐ์ฒด์ ๋ฝ์ด ํ๋ฆด ๋๊น์ง ๊ธฐ๋ค๋ฆฌ๋ ์ํ
-
Deprecated ๋ ๋ฉ์๋๋ ์ ์ธํ์์ต๋๋ค.
-
์ฐธ๊ณ (https://widevery.tistory.com/28)
์ค์ต ์ฝ๋
public class MyThread extends Thread{ @Override public void run() { for(int i=0;i<10000000;i++){ } try { Thread.sleep(1000); } catch (InterruptedException e) { e.printStackTrace(); } for(int i=0;i<10000000;i++){ } } }
์ค์ต์ผ๋ก ๋๋ ค๋ณธ ์ฐ๋ ๋ ์ฝ๋์ ๋๋ค. run ๋ฉ์๋์์๋ ์คํํ๋ค๊ฐ ์ค๊ฐ์ sleppํจ์๋ก ์ธํด TIMED_WAITING ์ํ๋ก ๋ง๋ ํ ๋ค์ ์คํํ๋ ์ฝ๋์ ๋๋ค.
public class StateTrackThread extends Thread{ Thread thread; public StateTrackThread(Thread thread) { this.thread = thread; } @Override public void run() { while (true){ System.out.println("My ์ฐ๋ ๋ ์ํ : "+thread.getState()); if(thread.getState() == Thread.State.NEW){ thread.start(); } if(thread.getState() == State.TERMINATED){ break; } try { Thread.sleep(200); } catch (InterruptedException e) { e.printStackTrace(); } } } }
์ฐ๋ ๋ ์ํ๋ฅผ ์ถ์ ํ๋ ๊ฒ์ ๋์์ ์คํ๋๋ ํ๊ฒฝ์์ ์ถ์ ํด์ผ ํ๊ธฐ ๋๋ฌธ์ ์๋ก์ด ์ฐ๋ ๋ ํ๋๋ฅผ ์์ฑํด์ผ ํฉ๋๋ค.
public class Main { public static void main(String[] args) { StateTrackThread thread = new StateTrackThread(new MyThread()); if(thread.getState() == Thread.State.NEW){ System.out.println("StateTrack ์ฐ๋ ๋ ์ํ : "+thread.getState()); thread.start(); } try { thread.join(); } catch (InterruptedException e) { e.printStackTrace(); } System.out.println("StateTrack ์ฐ๋ ๋ ์ํ : "+thread.getState()); } }
์ฐ๋ ๋ ์ฐ์ ์์
๋ฉํฐ ์ฐ๋ ๋ ํ๋ก๊ทธ๋๋ฐ์์ ์์๋ฅผ ์ ํ๋ ๊ฒ์ ์ค๋ ๋ ์ค์ผ์ค๋ง์ด๋ผ๊ณ ํฉ๋๋ค. ์ค๋ ๋ ์ค์ผ์ค๋ง ๋ฐฉ๋ฒ์๋ ์ฐ์ ์์(Priority) ์ค์ผ์ค๋ง๊ณผ ๋ผ์ด๋ ๋ก๋น(Round-Robin) ์ด ์์ต๋๋ค.
-
์ฐ์ ์์ ์ค์ผ์ค๋ง : ์ฐ๋ ๋์ ์ฐ์ ์์๊ฐ ๋์ ์์ผ๋ก ์คํ ์ํ๋ฅผ ๋ ๋ง์ด ์ฐจ์งํ๋ ์ค์ผ์ค๋ง ๋ฐฉ์์ ๋๋ค. ๊ฐ๋ฐ์๊ฐ setPriority() ๋ฉ์๋๋ฅผ ์ฌ์ฉํ์ฌ ์ฐ์ ์์๋ฅผ ์ค์ ํ ์ ์์ต๋๋ค.
-
๋ผ์ด๋ ๋ก๋น : Time Slice๋ฅผ ์ ํด์ ๊ทธ ์๊ฐ๋งํผ๋ง ์ฐ๋ ๋๊ฐ ์คํ๋๋๋ก ํ๊ณ ์ดํ์๋ ๋ค๋ฅธ ์ฐ๋ ๋๊ฐ ์คํ๋๋ ์ค์ผ์ค๋ง ๋ฐฉ์์ ๋๋ค. JVM์ ์ํด ๊ฒฐ์ ๋๊ธฐ ๋๋ฌธ์ ๊ฐ๋ฐ์๊ฐ ์์๋ก ์์ ๋ถ๊ฐ๋ฅ ํฉ๋๋ค.
์ฐ์ ์์ ์ค์ผ์ค๋ง ์ค์ต ์ฝ๋
์ฐ๋ ๋ ์ฐ์ ์์๋ 1๋ถํฐ 10๊น์ง ์กด์ฌํ๋ฉฐ 1์ด ๊ฐ์ฅ ๋ฎ์ ์ฐ๋ ๋(MIN_PRIORITY), 10์ด ๊ฐ์ฅ ๋์ ์ฐ๋ ๋(MAX_PRIORITY) ์ ๋๋ค.
public class MyThread extends Thread{ int num; public MyThread(int num) { this.num = num; } @Override public void run() { System.out.println(this.num+" thread start"); for(int i=0;i<10000;i++){ for(int j=0;j<10000;j++){ for(int k=0;k<10000;k++){ } } } System.out.println(this.num+" thread end"); } }
Thread๋ฅผ ๋ค์๊ณผ ๊ฐ์ด ์์ฑํ์์ต๋๋ค. ๋ฐ๋ณต๋ฌธ์ ์ฃผ์ด์ ์ฐ๋ ๋์ ์คํ ์๊ฐ์ ์ง์ฐ์์ผ ์ฐ์ ์์๋ก ์ธํด ์ค์ผ์ค๋ง ๊ฒฐ๊ณผ๋ฅผ ์ ์ ์์ต๋๋ค.
public class Main { public static void main(String[] args) { for(int i=1;i<=5;i++){ MyThread thread = new MyThread(i); if(i == 5){ thread.setPriority(Thread.MAX_PRIORITY); }else{ thread.setPriority(Thread.MIN_PRIORITY); } thread.start(); } } }
5๋ฒ ์ฐ๋ ๋์ ์ฐ์ ์์๋ฅผ MAX_PRIORITY๋ฅผ ๋๊ณ ๋๋จธ์ง ์ฐ๋ ๋์ ์ฐ์ ์์๋ MIN_PRIORITY๋ก ์ค์ ํฉ๋๋ค. ๊ฐ์ฅ ์ฐ์ ์์๊ฐ ๋์ ์ฐ๋ ๋๊ฐ ์คํ ์ํ๋ฅผ ๋ ๋ง์ด ๊ฐ์ ธ ์ ์ผ ๋จผ์ ์ข ๋ฃ๋๋ ๊ฒ์ ํ์ธํ ์ ์์ต๋๋ค.
Main ์ฐ๋ ๋
๋ชจ๋ ์๋ฐ ์์ฉ ํ๋ก๊ทธ๋จ์ Main ์ฐ๋ ๋๊ฐ main() ๋ฉ์๋๋ฅผ ์คํํ๋ฉด์ ์์ํฉ๋๋ค. ๋ฉ์ธ ์ฐ๋ ๋์์ ์ฌ๋ฌ ๊ฐ์ ์ฐ๋ ๋๋ฅผ ์์ฑํ์ฌ ๋ฉํฐ ์ฐ๋ ๋ ํ๋ก๊ทธ๋๋ฐ ๋ฐฉ์์ผ๋ก ์คํํ์ฌ ๋ณ๋ ฌ๋ก ์ฝ๋๋ฅผ ์คํํ ์ ์์ต๋๋ค. ๋ง์ฝ, ์ฑ๊ธ ์ค๋ ๋๋ผ๋ฉด ๋ฉ์ธ ์ฐ๋ ๋๊ฐ ์ข ๋ฃ๋๋ฉด ํ๋ก์ธ์ค๋ ์ข ๋ฃ๋์ง๋ง, ๋ฉํฐ ์ฐ๋ ๋๋ ๋ฉ์ธ ์ฐ๋ ๋๊ฐ ์ข ๋ฃ๋๋๋ผ๋ ๋๋จธ์ง ์ฐ๋ ๋๊ฐ ์ข ๋ฃ๋์ง ์์ผ๋ฉด ํ๋ก์ธ์ค๋ ์ข ๋ฃ๋์ง ์์ต๋๋ค.
๋ฐ์ํ'Android > Java' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[Java] Enum์ด๋? (0) 2021.02.14 [Java] ์๋ฐ ์ฐ๋ ๋ ๊ต์ฐฉ์ํ(deadlock) (2) 2021.02.07 [Java] ์๋ฐ ์ฐ๋ ๋ ์์ฑ(Thread, Runnable) (4) 2021.02.02 [Java] ์๋ฐ ์์ธ์ฒ๋ฆฌ (0) 2021.02.01 [Java] ์๋ฐ ์ธํฐํ์ด์ค(Interface) ์ฌ์ฉ (0) 2021.01.24