Thread
Thread(์ฐ๋ ๋)
Thread๋
์ปดํจํฐ OS์์ ํ๋ก์ธ์ค์ ๋ฉํฐํ
์คํน์ ์ง์ํ๋ค. ๊ทธ๋ฐ๋ฐ ์ฌ์ค ์ปดํจํฐ๋ ๋ฉํฐํ
์คํน์ ์ง์ํ์ง ์๊ณ
ํ๊ฐ์ง์ ํ๋ก์ธ์ค๋ง ์ฌ์ฉ ํ ์ ์๋ค.
ํ์ง๋ง ์ฌ๋ฌ๊ฐ์ง ํ๋ก์ธ์ค์ ๋ฐ์ดํฐ๋ฅผ ๋ฒ๊ฐ์๊ฐ๋ฉฐ(์ฌ๋์ด ์ธ์ง ํ ์ ์๋ ์๋) ์ฒ๋ฆฌํ์ฌ ์ฌ๋ฌ๊ฐ์ ํ๋ก์ธ์ค๋ฅผ ๋๋ ค ๋ฉํฐํ
์คํน์ด ๋ ์ ์๊ฒ ํ๋ค.
์ด๊ฒ์ java ํ๋ก๊ทธ๋จ์์๋ ์ ์ฉ์ด ๊ฐ๋ฅํ๋ฐ ์ด๊ฒ์ Thread๋ผ๊ณ ํ๋๋ฐ ๋ฉํฐ ์ฐ๋ ๋๋ผ๊ณ ๋ ํ๋ค.
Thread์ ์ฅ์ ์ผ๋ก๋
- ๋ฉ๋ชจ๋ฆฌ ๊ณต์ ๋ก ์ธํ ์์์๋ชจ๋ฅผ ์ค์ผ ์ ์๋ค.
- ๋์์ ๋๊ฐ์ง์ ์ผ์ ํ ์ ์๋ค(๋ฉํฐ ํ ์คํน)
Thread์ ๋จ์ ์ผ๋ก๋
- Thread๋ผ๋ฆฌ์ ์ถฉ๋์ด ๋ฐ์ ํ ์ ์๋ค.
- ์ฝ๋๊ฐ ๋์กํด์ ๋ฒ๊ทธ ํ๋ฅ ์ด ๋์์ง ์ ์๋ค.
Thread์ ์ํ
Thread๋ Life Cycle์ ์ํ์ ํตํด ์คํ์ด ๋๋๋ฐ
1. Runnable (์ค๋น์ํ)
์ค๋ ๋๊ฐ ์คํ๋๊ธฐ ์ํ ์ค๋น๋จ๊ณ์ ๋๋ค. CPU๋ฅผ ์ ์ ํ๊ณ ์์ง์์ผ๋ฉฐ ์คํ(Running ์ํ)์ ํ๊ธฐ ์ํด ๋๊ธฐํ๊ณ ์๋ ์ํ์ ๋๋ค. ์ฝ๋ฉ ์์์ start( ) ๋ฉ์๋๋ฅผ ํธ์ถํ๋ฉด run( ) ๋ฉ์๋์ ์ค์ ๋ ์ค๋ ๋๊ฐ Runnable ์ํ๋ก ์ง์ ํฉ๋๋ค. โReadyโ ์ํ๋ผ๊ณ ๋ ํฉ๋๋ค.
2. Running (์คํ์ํ)
CPU๋ฅผ ์ ์ ํ์ฌ ์คํํ๊ณ ์๋ ์ํ์ด๋ฉฐ run() ๋ฉ์๋๋ JVM๋ง์ด ํธ์ถ ๊ฐ๋ฅํฉ๋๋ค. Runnable(์ค๋น์ํ)์ ์๋ ์ฌ๋ฌ ์ค๋ ๋ ์ค ์ฐ์ ์์๋ฅผ ๊ฐ์ง ์ค๋ ๋๊ฐ ๊ฒฐ์ ๋๋ฉด JVM์ด ์๋์ผ๋ก run( ) ๋ฉ์๋๋ฅผ ํธ์ถํ์ฌ ์ค๋ ๋๊ฐ Running ์ํ๋ก ์ง์ ํฉ๋๋ค.
3. Dead (์ข ๋ฃ์ํ)
Running ์ํ์์ ์ค๋ ๋๊ฐ ๋ชจ๋ ์คํ๋๊ณ ๋ ํ ์๋ฃ ์ํ์ ๋๋ค. โDoneโ ์ํ๋ผ๊ณ ๋ ํฉ๋๋ค.
4. Blocked (์ง์ฐ ์ํ)
CPU๋ฅผ ์ ์ ๊ถ์ ์์คํ ์ํ์ ๋๋ค. ํ์ ํน์ ๋ฉ์๋๋ฅผ ์คํ์์ผ Runnable(์ค๋น์ํ)๋ก ์ ํํฉ๋๋ค.
wait( ) ๋ฉ์๋์ ์ํด Blocked ์ํ๊ฐ ๋ ์ค๋ ๋๋ notify( ) ๋ฉ์๋๊ฐ ํธ์ถ๋๋ฉด Runnable ์ํ๋ก ๊ฐ๋๋ค. sleep(์๊ฐ) ๋ฉ์๋์ ์ํด Blocked ์ํ๊ฐ ๋ ์ค๋ ๋๋ ์ง์ ๋ ์๊ฐ์ด ์ง๋๋ฉด Runnable ์ํ๋ก ๊ฐ๋๋ค.
Thread์ ์์ฑ๊ณผ ์ ์ฉ
Thread๋ฅผ ์์ฑํ์ฌ ์์ํ๋ ค๋ฉด Method Start()๊ฐ ํ์ํ๋ฐ ์ด๊ฒ์ Thread Class์ ์๋ค.
๋ฐฉ๋ฒ์ผ๋ก๋ 2๊ฐ์ง๊ฐ ์๋๋ฐ 1. Thread๋ฅผ extends๋ก ์์๋ฐ์ start()๋ฅผ ์ฌ์ฉํ๋ ๋ฐฉ๋ฒ
class A extends Thread{
A thd = new A();
thd.start();
}
2. Runnable interface๋ฅผ ๊ตฌํ(์์?)ํ์ฌ Thread(Runnable e)์์ฑ์๋ฅผ ํตํด ์ธ์คํด์คํ ํ์ฌ ์ฌ์ฉํ๋ ๋ฐฉ๋ฒ
class B implements Runnable{
B b = new B();
Thread thd = new Thread();
thd.strat();
}
Thread์ ์ฐ์ ์์
sleep() ๋ฅผ ์ฌ์ฉํ๋ฉด ์ ์ ์๋ ์ฌ์ค์ด ์๋๋ฐ Thread๋ ๋ฌด์ฐจ๋ณ์ ์์๋ก ์คํ์ด ๋๋ ๊ฒ์ด ์๋๋ผ
๋ค์ด์จ ์์๋๋ก ์ฒซ๋ฒ์งธ, ๋๋ฒ์งธ ๋ฒ๊ฐ์๊ฐ๋ฉฐ ์คํ๋๋ ๊ฒ์ ๋ณผ ์ ์๋ค.
์ ์ฐ์ quote๋ฐฉ์์ ๊ฐ์ ธ ๋๋ค์ด ์๋ ์ฐ์ ์์๋ฅผ ๊ฐ์ง๋ค๋ ๊ฒ์ ์ ์ ์๋ค.
Field๊ฐ์ผ๋ก MAX, MIN , NORM์ด ์๋ค.
//Field
static final MAX_PRIORITY = 10;
static final NORM_PRIORITY = 5;
static final MIN_PRIORITY = 1;
method setPriority()๋ฅผ ์ฌ์ฉํ์ฌ ์ฐ๋ฆฌ๋ ์ด๋์ ๋ ์ฐ์ ์์๋ฅผ ์ ํด ์ค ์ ์๋ค.
//main
t1.setPriority(Thread.MAX_PRIORITY);
t2.setPriority(Thread.MIN_PRIORITY);
t3.setPriority(Thread.NORM_PRIORITY);
t1.start();
t2.start();
t3.start();
//result
//t2 ==> t3 ==> t1 ์์๋ก ์์
//ํ์ง๋ง ์ฐ์ ์์๋ฅผ ์ง์ ํ ๋ฟ ์ ๋์ ์ธ ์์๋ ์๋๋ค
Synchronized
Thread์ ์ฅ์ ์ผ๋ก๋ ๊ฐ์ ๋ฉ๋ชจ๋ฆฌ๋ฅผ ๊ณต์ ํ๋ค๋ ๊ฒ์ด๋ค.
๊ทธ๋ฐ๋ฐ ๋ง์ฝ ํ Thread์์ method์ ์ ๊ทผํ์ฌ ์ํ๊ฐ์ ๋ณ๊ฒฝํ ๋ ๋ง์ฝ ๋ค๋ฅธ Thread์์ ์ ๊ทผ์ ํ๋ค๋ฉด
๋ถ๋ช
์ถฉ๋์ด ๋ฐ์ํ ๊ฒ์ด๋ค.
์ด๊ฒ์ ์ค์ํ์์๋ ๋ณผ ์ ์๋๋ฐ excel ํ์ผ์ ๊ณต์ ํ์ฌ ์์ ํ๊ณ ์๋ ๋์ค์ ๋ค๋ฅธ ๊ณณ์์
๊ณต์ ํ excel์ ์ ๊ทผํ์ฌ ๋ ์์ ์ํ๊ฒ๋๋ฉด ํ์ผ ์ถฉ๋์ด ๋ฐ์ํ๋ค.
์ด๊ฒ๊ณผ ๊ฐ์ ๊ฒฝ์ฐ๋ผ๊ณ ๋ณผ ์ ์๋ค.
java๋ ์ด๊ฒ์ ๋ฐฉ์งํ๊ธฐ ์ํด Synchronized๋ฅผ ์ง์ํ๋ค.
//method ์ ์ฒด ์์ญ์ ์ง์
public synchronized void method(){
//.....
}
//ํน์ ํ ์์ญ์ ์ง์
synchronized (๋งค๊ฐ๋ณ์ ){
//.....
}
์์ ๊ฐ์ด ์ฌ์ฉํ๋ฉด ํ๋์ KEY๋ฅผ ์ ์ฑํ๋๋ฐ ๋ง์ฝ Thread๊ฐ synchronized์ ์ ๊ทผํ๊ฒ ๋๋ค๋ฉด KEY๋ฅผ ๊ฐ์ง๊ฒ ๋๋ค.
Thread๊ฐ Running์์ ๋์ ๋ค๋ฅธ Thread๊ฐ ์คํ์ด ๋๋๋ผ๋ KEY๋ฅผ ๊ฐ์ง๊ณ ์์ง ์๊ธฐ ๋๋ฌธ์ method์ ํน์ ์์ญ์๋ ์ ๊ทผ ํ ์ ์๊ฒ ๋๋ค.
์ ๊ทผํ์ง ๋ชปํ Thread๋ Synchronized Pool์ด๋ผ๋ ์์ญ์ ๋ค์ด๊ฐ๊ฒ๋์ด KEY๋ฅผ ๊ฐ์ง Thread๊ฐ ์์
์ ์ํ ํ ํ ๋ค์ Thread ์ํ์ ๋ค์ด๊ฐ๊ฒ๋๋ค.
์ด๋ฌํ ๋ฐฉ๋ฒ์ผ๋ก Thread์ ๊ณต์ ๋ฅผ ํตํ ์ถฉ๋์ ๋ง์ ์ ์๊ฒ ๋๋ค.
ํ์ง๋ง ์ฝ๋๋ฅผ ์๋ชปํ์ฌ ์์ฑํ๊ฒ ๋๋ฉด KEY๋ฅผ ๊ฐ์ง Thread๊ฐ ๋ฌดํ๋ฐ๋ณต๋๋ ์ํฉ์ด ๋ฐ์ํ์ฌ ๋ค๋ฅธ Thread๊ฐ
์คํ์ด ๋์ง ์๋ ์ํฉ์ด ๋ฐ์ํ ์ ์๋ค. ๊ทธ๋ ๊ธฐ์ ํญ์ ์ฃผ์ํ๋ฉฐ ์ฝ๋๋ฅผ ์์ฑํด์ผํ๋ค.
Leave a comment