Java Thread π
μ€λ λλ νλμ νλ‘μΈμ€ μμμ λ 립μ μΌλ‘ μ€νλλ μμ λ¨μλ₯Ό λ»ν¨
λͺ¨λ νλ‘μΈμ€μλ ν κ° μ΄μμ μ€λ λκ° μ‘΄μ¬νλ©° μμ μ μνν¨
λκ° μ΄μμ μ€λ λλ₯Ό κ°μ§λ νλ‘μΈμ€λ₯Ό λ©ν°μ€λ λ νλ‘μΈμ€λΌκ³ ν¨
β» νλ‘μΈμ€ : μ€νμ€μΈ νλ‘κ·Έλ¨, μ΄μ체μ μ μν΄ λ©λͺ¨λ¦¬ 곡κ°μ ν λΉ λ°μ λμμ€μΈ κ²μ λ»ν¨
μ΄λ° νλ‘μΈμ€λ νλ‘κ·Έλ¨μ μ¬μ©λλ λ°μ΄ν°, λ©λͺ¨λ¦¬ λ±μ μμ, μ€λ λλ‘ κ΅¬μ±λ¨
Threadμ μμ±μ£ΌκΈ° π
Runnable μν :
μ€λ λ μ€ν μ μ€λΉμν
Running μν :
μ€μΌμ€λ¬μ μν΄ μ νλ μ€λ λκ° μ€νλλ λ¨κ³
Blocked μν :
μ€λ λκ° μμ μ μμνμ§ λͺ»νκ³ μ μ μμ μ λ©μΆλ λ¨κ³
Threadμ μλͺ μ£ΌκΈ° πΆ
Runnable (μ€λΉμν)
μ€λ λ μ€νλκΈ° μν μ€λΉλ¨κ³, CPU λ―Έμ μ μ€μ΄κ³ μ€ννκΈ° μν΄ λκΈ°νκ³ μλ μν
Running (μ€νμν)
CPU μ μ νμ¬ μ€ν μ€μΈ μνμ΄κ³ run() λ©μλλ JVMλ§μ΄ νΈμΆ κ°λ₯
μ€λΉμνμ μ¬λ¬ μ€λ λ μ€ μ°μ μμ μ€λ λ κ²°μ λ μ JVMμ΄ μλμΌλ‘ run() λ©μλ νΈμΆ -> μ€λ λκ° Running μνλ‘ μ§μ
Dead (μ’ λ£μν)
μ€νμνμμ μ€λ λκ° λͺ¨λ μ€νλκ³ λ ν μλ£ μν(doneμνλΌκ³ λ ν¨)
Blocked (μ§μ° μν)
CPU μ μ κΆμ μμ€ν μν, νμ νΉμ λ©μλ μ€ν μμΌ μ€λΉμνλ‘ μ ν,
wait() λ©μλμ μν΄ Blocked μνκ° λ μ€λ λλ nofity() λ©μλ νΈμΆ λ μ μ€λΉμνλ‘ κ°,
sleep(μκ°) λ©μλμ μν΄ Blocked μνκ° λ μ€λ λλ μ§μ λ μκ°μ΄ μ§λλ©΄ μ€λΉ μνλ‘ κ°
Thread μμ±/μ€ν π
μ€λ λ μμ±/μ€ν λ°©λ²μ 2κ°μ§κ° μμ
λ λ€ run() λ©μλμ μμ ν λ΄μ©μ μμ±νλ©΄ λλ€.
new Thread()λ‘ κ°μ²΄ μμ± ν start() μ€ν μ λ΄κ° μμ±ν run()μ μμ±λ λ΄μ©μ΄ μ€νλλ€.
1.Thread class μμ
μ€λ λ ν΄λμ€λ₯Ό μμ λ°μ κ²½μ° λ€λ₯Έ ν΄λμ€λ₯Ό μμ λ°μ§ λͺ»νκΈ°μ μΌλ°μ μΌλ‘ Runnable μΈν°νμ΄μ€λ₯Ό ꡬννλ λ°©λ²μ λ§μ΄ μ¬μ©ν¨
// Thread class μ§μ μμ μμ
package java_test.dev.java;
public class Thread1 extends Thread {
private int[] cnt;
public Thread1(String threadname) {
super(threadname);
cnt = new int[10];
for (int start = 0; start < cnt.length; start++) {
cnt[start] = start;
}
}
// μ€λ λ μμ
λ΄μ©
public void run() {
for (int start : cnt) {
try {
// 1μ΄ λκΈ°
Thread.sleep(1000);
} catch (InterruptedException ie) {
ie.printStackTrace();
}
System.out.println("μ€λ λμ΄λ¦:" + currentThread().getName());
System.out.println("temp value :" + start);
}
}
// λ©μΈ νΈμΆ
public static void main(String[] args) {
Thread1 t1 = new Thread1("첫λ²μ§Έ");
t1.start();
}
}
2.Runnable μΈν°νμ΄μ€ ꡬν
μΆμ λ©μλμΈ run() 1κ°λ§ κ°μ§κ³ μλ ν¨μν μΈν°νμ΄μ€μ΄λ€.
// Runnable μΈν°νμ΄μ€ ꡬν μμ
package java_test.dev.java;
public class Thread2 implements Runnable {
private int[] temp;
public Thread2() {
temp = new int[10];
for (int start = 0; start < temp.length; start++) {
temp[start] = start;
}
}
// μ€λ λ μμ
λ΄μ©(Runnable ꡬν μ κ°μ μ€λ²λΌμ΄λ)
@Override
public void run() {
for (int start : temp) {
try {
// 1μ΄ λκΈ°
Thread.sleep(1000);
} catch (InterruptedException ie) {
ie.printStackTrace();
}
System.out.println("μ€λ λμ΄λ¦:" + Thread.currentThread().getName());
System.out.println("temp value :" + start);
}
}
public static void main(String[] args) {
Thread2 t2 = new Thread2();
Thread t = new Thread(t2, "λλ² μ§Έ");
t.start();
}
}
λ©ν° μ€λ λ
μ¬λ¬ μ€λ λλ₯Ό λμμ μ€νμν€λ κΈ°λ²
// λ©ν° μ€λ λ μμ
package java_test.dev.java;
class ATM implements Runnable {
private long depositeMoney = 10000;
// μ€λ λμμ ν μμ
public void run() {
// multi threadμμ λ°μ΄ν° 곡μ
synchronized (this) {
for (int i = 0; i < 10; i++) {
// μ€λΉμνλ‘ λ³ν¨
notify();
try {
// wait()μΌλ‘ μΈν΄ blocked μνλ‘ λ³ν¨
wait();
// 1μ΄ λκΈ°
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
// μμ‘μ΄ μμ΄μ§λ©΄ λ°λ³΅λ¬Έ λΉ μ Έλμ΄
if (getDepositeMoney() <= 0)
break;
withDraw(1000);
}
}
}
// 1000μμ© μ°¨κ°
public void withDraw(long howMuch) {
// μμ‘μ΄ μμΌλ©΄
if (getDepositeMoney() > 0) {
depositeMoney -= howMuch;
System.out.print(Thread.currentThread().getName() + " , ");
System.out.printf("μμ‘ : %,d μ %n", getDepositeMoney());
} else {
System.out.print(Thread.currentThread().getName() + " , ");
System.out.println("μμ‘μ΄ λΆμ‘±ν©λλ€.");
}
}
// μμ‘ μ‘°ν
public long getDepositeMoney() {
return depositeMoney;
}
}
public class MultiThread {
// main μ€ν
public static void main(String[] args) {
ATM atm = new ATM();
// multi thread μμ±
Thread mother = new Thread(atm, "mother");
Thread son = new Thread(atm, "son");
// multi thread μ€ν
mother.start();
son.start();
}
}
synchronized λλ¬Έμ 2κ°μ μ€λ λμμ 10,000μμ΄ κ°μ΄ μ¬μ©λ κ±Έ νμΈν μ μμ
Join(μ€λ λ λκΈ°)
μ€λ λλ λ³΄ν΅ λ€λ₯Έ μ€λ λμ λ 립μ μΌλ‘ μ€νλμ§λ§ λ€λ₯Έ μ€λ λκ° μ’ λ£λ λκΉμ§ κΈ°λ€λ €μΌ λλ κ²½μ°κ° λ°μν μ μμ
ex) Aμ€λ λκ° μ’ λ£λ ν B μ€λ λκ° μ€νλμ΄μΌ λ κ²½μ°
μ΄ λ join() μ¬μ©
package java_test.dev.java;
class ThreadJoin implements Runnable{
@Override
// μ€λ λ ꡬν
public void run() {
// TODO Auto-generated method stub
System.out.println("μ°λ λ1λ¨κ³");
thread2();
}
public void thread2() {
System.out.println("μ°λ λ2λ¨κ³");
thread3();
}
public void thread3() {
System.out.println("μ°λ λ3λ¨κ³");
}
public static void main(String[] args) {
// main thread μμ λ©μμ§ μΆλ ₯
System.out.println(Thread.currentThread().getName() + " start");
Runnable r = new ThreadJoin();
Thread thread = new Thread(r);
// μ€λ λ μ€ν
thread.start();
// main thread μ’
λ£ λ©μμ§ μΆλ ₯
System.out.println(Thread.currentThread().getName() + " end");
System.out.println("===========================================================");
}
}
μ κ²°κ³Όλ₯Ό 보면 main threadκ° μ’ λ£λκ³ λ λ€λ₯Έ μ€λ λκ° μ€νλλ κ±Έ μ μ μλ€.
μ΄λ₯Ό μ€λ λκ° μ’ λ£λ ν λ©μΈμ μ’ λ£μν€λλ‘ λ³κ²½νλ €λ©΄ μλμ²λΌ λ³κ²½νλ©΄ λλ€.
public static void main(String[] args) {
// main thread μμ λ©μμ§ μΆλ ₯
System.out.println(Thread.currentThread().getName() + " start");
Runnable r = new ThreadJoin();
Thread thread = new Thread(r);
// μ€λ λ μ€ν
thread.start();
// thread.join() μΆκ°(μμΈμ²λ¦¬ νμ)
try {
// thread μ’
λ£κΉμ§ κΈ°λ€λ¦Ό
thread.join();
} catch (Exception e) {
// TODO: handle exception
}
// main thread μ’
λ£ λ©μμ§ μΆλ ₯
System.out.println(Thread.currentThread().getName() + " end");
System.out.println("===========================================================");
}
λ©μΈ μμ ν μ€λ λ μ’ λ£ ν λ©μΈμ΄ μ’ λ£λ κ±Έ λ³Ό μ μλ€.
μ°Έμ‘° : μ½λ©ν©ν 리λ λΈλ‘κ·Έ, 2018.12.17, https://coding-factory.tistory.com/279,
TCP School, http://www.tcpschool.com/java/java_thread_concept
μ½λ©λ²λ λ λΈλ‘κ·Έ, https://dpdpwl.tistory.com/13

'IT > development' μΉ΄ν κ³ λ¦¬μ λ€λ₯Έ κΈ
[apache/php] apache/php λ‘컬νκ²½ μΈν (apm, xampp λ―Έμ¬μ©) (0) | 2022.11.23 |
---|---|
[Java] java class version νμΈ(feat. unsupported major version..) (0) | 2022.11.23 |
[eclipse] preparing launch delegate(feat. tomcat 무ν starting) (0) | 2022.11.23 |
[eclipse] eclipse java comment template μ€μ (0) | 2022.11.23 |
[spring] μμ‘΄μ± μ£Όμ μ NPE(NullPointerException) (0) | 2022.11.23 |
λκΈ