- Thread
- Thread ν΄λμ€μ Runnable μΈν°νμ΄μ€
- main μ°λ λ
- synchronized
- λ°λλ½
Table of contents generated with markdown-toc
Thread
λ CPUμμ μμ
μ μννλ κ°μ₯ μμ λ¨μμ΄λ€. νλ‘κ·Έλ¨ νλλ₯Ό μ€νμν€λ©΄ νλ μ΄μμ threadκ° μ€νλλ€. μλ₯Όλ€μ΄, "Hello, World"λΌλ μλ° νλ‘κ·Έλ¨μ μ€νμν€λ©΄ λ¬Έμμ΄μ μΆλ ₯νλ μ°λ λκ° μ€νλλ€. νμ§λ§ μ€μ λ‘λ λ€λ₯Έ μ°λ λλ κ°μ΄ μ€νμ΄ λλλ°, λ©λͺ¨λ¦¬ μμ
μ ν΄μ£Όλ GC(Garbage Collection) κ΄λ ¨ μ°λ λκ° κ·Έ μμ΄λ€.
λ κ°μ§ μ°μ°μ μννλ μν©μ΄ μλ€κ³ κ°μ νμ. νλλ 1λΆν° 1000κΉμ§μ ν©μ ꡬνλ μ°μ°μ΄κ³ , λ€λ₯Έ νλλ 1λΆν° 10κΉμ§μ κ³±μ ꡬνλ μ°μ°μ΄λ€.
public class EX1 {
public static void main(String[] args) {
int calculation1 = 1;
int calculation2 = 1;
for(int i=2;i<=1000;i++) calculation1+=i;
for(int i=2;i<=10;i++) calculation2*=i;
System.out.println("calculation1 is " + calculation1);
System.out.println("calculation2 is " + calculation2);
}
}
νλ‘κ·Έλ¨ μ€ν κ³Όμ
μ μ°μ calculation1
μ κ³μ° ν, calculation2
λ₯Ό κ³μ°νλ€.
νμ§λ§ μ°μ° 1κ³Ό μ°μ° 2λ λ 립μ μΈλ°, μ무 κ΄κ³κ° μλ λ μ°μ°μ κ΅³μ΄ μμλλ‘ ν μ΄μ κ° μλ€. μ¦ λ μ°μ°μ νκΊΌλ²μ ν΄λ μκ΄μ΄ μλ€.
μ°λ λλ₯Ό ν΅ν΄ λ μ°μ°μ λμμ μ§νν΄λ³΄μ.
class C1 extends Thread{
public void run() {
int result = 1;
for(int i=2;i<=1000;i++) result+=i;
System.out.println("calculation1 is " + result);
}
}
class C2 extends Thread{
public void run() {
int result = 1;
for(int i=2;i<=10;i++) result*=i;
System.out.println("calculation2 is " + result);
}
}
class ex2 {
public static void main(String[] args) {
C1 c1 = new C1();
C2 c2 = new C2();
c1.start();
c2.start();
}
}
μΆλ ₯κ²°κ³Ό
calculation2 is 3628800
calculation1 is 500500
c1κ³Ό c2μ μ°μ°μ΄ λμμ μ€ν λλλ°, c2λ 10λ²λ§ μ°μ°μ μννλ―λ‘ λ 빨리 λλκΈ° λλ¬Έμ μΆλ ₯κ²°κ³Όλ c2κ° λ¨Όμ λμλ€.
λ§μ½ λ κ°μ μ°μ°μ΄ 1μκ°μ© κ±Έλ¦°λ€λ©΄, μ°λ λλ₯Ό μμ΄λ€λ©΄ κ°κ° μ°μ°μ μνν΄μΌ νλ―λ‘ 2μκ°μ΄ κ±Έλ¦¬κ² μ§λ§, μ°λ λλ₯Ό μ¬μ©νλ©΄ μ°μ°μ λμμ μννλ―λ‘ 1μκ°μ΄ 걸릴κ²μ΄λ€.
https://sjh836.tistory.com/121
μ°λ λκ° μμ±λ μν. μμ§ start()
λμ§ μμ
start()κ° νΈμΆλμ΄ μ€ν λκΈ°. run() νλ©΄ Running(CPU μ μ )μ΄ λλ€. Runnable pool
μ λͺ¨μ¬μμ
μΌμμ μ§, λ€λ₯Έ μ°λ λμ ν΅μ§λ₯Ό κΈ°λ€λ¦Ό
μΌμμ μ§, μ£Όμ΄μ§ μκ°λμ κΈ°λ€λ¦Ό
μΌμμ μ§, μ¬μ©νλ €λ κ°μ²΄μ lockμ΄ ν릴 λ κΉμ§ λκΈ° etc..
μ€ν λ§μΉ λ€ μ’ λ£. run()μ΄ λλλ©΄ terminated λλ©΄μ μλ©Έ
μλ° μ°λ λλ μ°μ μμ
λ λΌμ΄λλ‘λΉ
μΌλ‘ μ€μΌμ€λ§νλ€.
Priority
κ°μ΄ λμ μ°λ λκ° μ€ν μνλ₯Ό λ λ§μ΄ κ°μ§λ€. κΈ°λ³Έμ΄ 5
μ΄λ©° κ°λ°μκ° setPriority()
λ₯Ό ν΅ν΄ 컨νΈλ‘€ ν μ μλ€.
μκ° ν λΉλ
(Time Slice)λ₯Ό μ νμ¬ νλμ μ°λ λλ₯Ό μ ν΄μ§ μκ°λ§νΌ μ€νμν¨ λ€ λ€λ₯Έ μ°λ λλ₯Ό μ€ννλ€. JVM
μ΄ μ»¨νΈλ‘€νλ€.
μ°λ λλ₯Ό μμ±νλ λ°©λ²μ λ κ°μ§κ° μλλ°, νλλ Thread
ν΄λμ€λ₯Ό μ¬μ©νλ κ²μ΄κ³ , λ€λ₯Έ νλλ Runnable
μΈν°νμ΄μ€λ₯Ό μ¬μ©νλ κ²μ΄λ€.
λ ν΄λμ€ λͺ¨λ java.lang
ν¨ν€μ§μ μμΌλ―λ‘ λ³λμ importκ° νμμλ€. λν Runnable
μΈν°νμ΄μ€μλ ꡬνν λ©μλκ° run()λ§ μ‘΄μ¬νλ―λ‘, run()λ§ κ΅¬ννλ©΄ λλ€.
class UseRunnable implements Runnable {
@Override
public void run() {
System.out.println("UseRunnable run() method.");
}
}
class UseThread extends Thread {
public void run() {
System.out.println("UseThread run() method.");
}
}
class ThreadSample {
public static void main(String[] args) {
UseRunnable useRunnable = new UseRunnable();
UseThread useThread = new UseThread();
new Thread(useRunnable).start();
useThread.start();
System.out.println("ThreadSample program ends");
}
}
μ€μ λ‘ μ€νλλ λΆλΆμ run()
λ©μλμ΄κ³ , κ·Έ λΆλΆμ μ€νμν€λ λ©μλλ start()
μ΄λ€. μ°λ λλ₯Ό μμ±νλ€κ³ ν΄μ μλμΌλ‘ μ€νλλ κ²μ΄ μλλΌ, start()λ₯Ό νΈμΆν΄μΌ μ°λ λκ° μ€νλλ€. μ€μ λ‘λ start()κ° νΈμΆ λμ΄μ λ°λ‘ μ€νλλ κ²μ΄ μλλΌ, μ€ν λκΈ° μνμ μλ€κ° μμ μ μ°¨λ‘κ° λμ΄μΌ μ€νλλ€. μ€ν λκΈ° μ€μΈ μ°λ λκ° μλ€λ©΄ λ°λ‘ μ€νμνκ° λλ€.
νμ§λ§ Runnableμ ꡬννμ¬ λ§λ μ°λ λλ λ°λ‘ μ€νν μ μκ³ , new Thread(useRunnable)κ³Ό κ°μ΄ Thread ν΄λμ€μ μμ±μλ₯Ό ν΅ν΄ κ°μ²΄λ₯Ό λ§λ€μ΄μΌ νλ€.
λ²κ±°λ‘μ§λ§ μλ°μμλ λ€μ€μμμ΄ λμ§ μκΈ° λλ¬Έμ, Thread ν΄λμ€λ₯Ό μμ λ°λλ€λ©΄ λ€λ₯Έ ν΄λμ€λ μμλ°μ μ μλ€. νμ§λ§ μΈν°νμ΄μ€λ μ¬λ¬ κ°λ₯Ό ꡬνν μ μμΌλ―λ‘ λ³΄ν΅μ Runnableμ ꡬννλ κ²μ΄ μΌλ°μ μ΄λ€.
ν λ² μ’
λ£λ μ°λ λλ λ€μ μ€νν μ μλ€. μ¦, νλμ μ°λ λμ λν΄ start()κ° ν λ²λ§ νΈμΆλ μ μλ€. λ§μΌ μ°λ λμ μμ
μ ν λ² λ μνν΄μΌ νλ€λ©΄, μλ‘μ΄ μ°λ λλ₯Ό μμ±ν λ€μ start()λ₯Ό νΈμΆν΄μΌνλ€. νλμ μ°λ λμ λν΄ start()λ₯Ό λ λ² μ΄μ νΈμΆνλ©΄ μ€ν μμ IllegatThreadStateException
μ΄ λ°μνλ€.
μμ μ½λλ₯Ό μ¬λ¬ λ² μ€νμν€λ©΄, μΆλ ₯μμκ° λ€μ£½λ°μ£½μ΄ λλ€. μ°λ λλ₯Ό start() λ©μλλ₯Ό ν΅ν΄ μμνλ€λ κ²μ, νλμ μ°λ λλ₯Ό JVMμ μΆκ°νμ¬ μ€ννλ€λ κ²μ΄λ€. new Thread(useRunnable).start()λ₯Ό ν΅ν΄ useRunnable μ°λ λκ° JVMμ μΆκ°λκ³ , useThread.start()λ₯Ό ν΅ν΄ useTread μ°λ λκ° JVMμ μΆκ°λλ€. useRunnableμ΄ useThreadλ₯Ό ν΅ν΄ JVMμ λ€μ΄κ°μ§λ§ λ―ΈμΈν μ°¨μ΄μ΄λ©° λ μ°λ λκ° ν¨κ» μ€νλκ³ κ°μ μ°μ°μ ν΄λ CPU μνμ λ°λΌ μ€νμκ°μ λ―ΈμΈν μ°¨μ΄κ° μμ μ μλ€.
λν useRunnableκ³Ό useThreadλ ThreadSample νλ‘κ·Έλ¨κ³Ό λ³κ°λ‘ μ§νλλ―λ‘, useRunnable, useThreadλ μ§νμ€μ΄λ©΄μ κ·Έ λ°μ μΆλ ₯ μ½λκ° μ€νλλ€. λ°λΌμ κ²°κ³Όκ° λ€μ£½λ°μ£½μ΄ λλ€.
μ°μ κΆμ΄ λμΌν μ°λ λμκ² μ€νν κΈ°νλ₯Ό μ보νλ€. μ΄λ₯Ό μ€ννλ©΄ RUNNING
μνμμ RUNNABLE
μνλ‘ λ°λλ€.
μΌμ μκ° λμ μ°λ λλ₯Ό λ©μΆκ² νλ€.
static void sleep(long millis);
static void sleep(long millis, int nanos);
λ°λ¦¬ μΈμ»¨λ(1000λΆμ 1μ΄)μ λλ Έ μΈμ»¨λ(10μ΅λΆμ 1μ΄)μ μκ° λ¨μλ‘ μΈλ°νκ² κ°μ μ§μ ν μ μλ€.
sleepμ νΈμΆν λ νμ try-catch
λ¬ΈμΌλ‘ μμΈ μ²λ¦¬λ₯Ό ν΄μΌνλ€.
λ€λ₯Έ μ°λ λμ νλ μμ
ν λ μ£Όλ‘ μ΄λ€. νΈμΆλλ©΄ BLOCKED
μνκ° λμλ€κ°, κΈ°λ€λ¦¬λ μ°λ λμ μμ
μ΄ λλλ©΄ λ€μ RUNNABLE
λ‘ κ°λ€.
λ°λͺ¬ μ°λ λ
(daemon thread)
main λ©μλμ μμ μ μννλ κ²λ μ°λ λμ΄λ©°, μ΄λ₯Ό main μ°λ λλΌκ³ νλ€. μ§κΈκΉμ§λ main λ©μλκ° μνμ λ§μΉλ©΄ νλ‘κ·Έλ¨μ΄ μ’ λ£λμμ§λ§ main λ©μλκ° μνμ λ§μ³€λ€κ³ νλλΌλ λ€λ₯Έ μ°λ λκ° μμ§ μμ μ λ§μΉμ§ μμ μνλΌλ©΄ νλ‘κ·Έλ¨μ΄ μ’ λ£λμ§ μλλ€.
νλμ μ°λ λκ° μμ μ λ€ λλ΄κΈ° μ μλ λ€λ₯Έ threadκ° μμ μ μ μ΄κΆμ κ°μ Έκ°μ§ λͺ»νκ² νλ€.
Thread
λ 곡μ μμμ μλ‘sharing
νλ€.- λ΄κ° μμ νλ λμ μ΄λ€ μ°λ λλ λ°©ν΄νμ§ λͺ»νλλ‘ λ³΄μ₯λ°μμΌν¨
- λκΈ°ν μ²λ¦¬λ 무κ²κΈ° λλ¬Έμ ν΄λΉνλ κΈ°λ₯μλ§ μ²λ¦¬ν΄μΌνλ€.
public class CommonCalculate {
private int value;
public CommonCalculate(){
value = 0;
}
public void plus(){
value++;
}
public int getValue(){
return value;
}
}
valueκ°μ λν΄μ£Όλ ν΄λμ€μ΄λ€.
public class ChangeValue extends Thread{
private CommonCalculate calc;
public ChangeValue(CommonCalculate calc){
this.calc = calc;
}
public void run(){
for(int i=0; i<10000; i++) calc.plus();
}
}
CommonCalculateλ₯Ό λ€λ£¨λ ChangeValueλΌλ ν΄λμ€μ΄λ€. calcμ valueκ°μ 1μ© μ¦κ°μν€λ μμ μ λ§ λ² μννλ€.
κ·Έλ¦¬κ³ μ΄ λ ν΄λμ€λ₯Ό μ¬μ©νλ SyncEx ν΄λμ€λ₯Ό λ§λ λ€.
public class SyncEx {
public static void main(String[] ar){
CommonCalculate calc = new CommonCalculate();
ChangeValue t1 = new ChangeValue(calc);
ChangeValue t2 = new ChangeValue(calc);
t1.start();
t2.start();
try{
t1.join();
t2.join();
System.out.println("calc.value = " + calc.getValue());
}catch(Exception e){
e.printStackTrace();
}
}
}
calc κ°μ²΄λ₯Ό t1κ³Ό t2 λͺ¨λ μ¬μ©νλ€. κ·Έλ¦¬κ³ t1, t2κ° μ€νλλλ°, try-catchλ¬Έμ μλ join λ©μλλ ν΄λΉ μ°λ λκ° λλ λ κΉμ§ κΈ°λ€λ¦°λ€. μ¦ t1, t2 μ°λ λκ° λͺ¨λ λλ λ κΉμ§ κΈ°λ€λ Έλ€κ° calc κ°μ²΄μ value κ°μ νμΈνλ€.
νμ§λ§ λ§€λ² μ€νν λ λ§λ€ κ°μ΄ λ€λ₯Ό λΏλλ¬ μμκ°κ³Όλ λ€λ₯΄κ² λμ€λλ°, κ·Έ μ΄μ λ t1κ³Ό t2 λ κ°μ²΄κ° λμμ μ§νλλ©΄μ κ°μ κ°μ²΄κ°μ κ°μ§κ³ μ°μ°νκΈ° λλ¬Έμ΄λ€.
plus() λ©μλμ μ°μ° μν κ³Όμ μ λ€μκ³Ό κ°λ€.
1. νμ¬ value κ°μ μ½κ³
2. value++λ₯Ό κ³μ°νκ³
3. valueκ°μ value++ν κ°μ λμ
νλ κ²μ΄λ€.
value κ°μ΄ 5λΌκ³ κ°μ νμ. t1μ μ°λ λ μ°μ°μ΄ 1λ¨κ³λ₯Ό μ§λ 2λ¨κ³ κΉμ§ μννμλ€λ©΄, λ¨μ μΌμ λμ λΏμ΄λ€. νμ§λ§ μ΄ λ t2 μ°λ λκ° 1λ¨κ³μΈ νμ¬ valueκ°μ μ½λ λ¨κ³λ₯Ό μ§ννλ € νλ€λ©΄, t2κ° μ½μ valueλ 5κ° λ§λ€. νμ§λ§ t2κ° valueκ°μ μ½μ ν t1μ΄ 3λ¨κ³λ₯Ό μ§ννλ©΄ valueλ 6μ΄ λλ€. κ·Έλ λ€λ©΄ t2κ° 3λ¨κ³ κΉμ§ μ§νν λ€μμ valueκ°μ 6μ΄ λ κ²μ΄λ€. t1μ μ€νμ΄ λλ λ€ t2κ° μ€νλμλ€λ©΄ valueκ°μ 7μ΄ λμμ κ²μ΄λ€.
μ΄λ° κ²½μ°λ€μ μ±ν¬κ° μλ§κ±°λ νΉμ μ°λ λμ μμ νμ§ μλ€λΌκ³ νννλλ°, μ΄λ¬ν μν©μ synchronized
μμ
μ΄λ‘ λ°©μ§ν μ μλ€.
public synchronized void plus(){
value++;
}
plus() λ©μλμ λ€μκ³Ό κ°μ΄ synchronized
μμ½μ΄λ₯Ό μ¨μ£Όλ©΄ μμκ°μ΄ λμ¨λ€. synchronized
λ ν΄λΉ λ©μλκ° νλμ μ°λ λμμλ§ νΈμΆλλλ‘ νλ€.
νμ§λ§ μ΄λ κ² synchronized
λ₯Ό μ¬μ©νλ©΄ λΉν¨μ¨μ λ¬Έμ κ° λ°μνλλ°, μλ₯Ό λ€μ΄ μ¬λ¬ κ°μ μ°μ°μ΄ μ‘΄μ¬νκ³ μ±ν¬λ₯Ό κ³ λ €ν΄μΌν μ°μ°μ νλ λΏμ΄λΌκ³ κ°μ νμ. μ΄λ¬ν μν©μμ λ©μλ μ체μ synchronized
λ₯Ό λΆμ΄λ©΄, λ©μλ μμ λͺ¨λ μ°μ°μ΄ ν λ²μ νλμ μ°λ λ λ§ μ κ·Όν μ μμΌλ―λ‘ λΉν¨μΈμ μ΄λ€. κ·Έλ° κ²½μ° λ€μκ³Ό κ°μ΄ μ±ν¬λ₯Ό κ³ λ €ν΄μ£Όκ³ μΆμ μ°μ°μλ§ synchronized
λ₯Ό μ¬μ©ν μ μλ€.
Object plusLock = new Object();
public void plus(){
synchronized(plusLock){
value++;
}
}
μ κΈ μ²λ¦¬λ₯Ό νκΈ° μν΄ thisμ μ¬μ© λμ λ³λμ κ°μ²΄λ₯Ό μ¬μ©νμ¬ lock νλ€.
1κ°μ μμ©νλ‘κ·Έλ¨μ΄ μ°λ λλ‘ λΆλ¦¬λ νλ¦ μ²λ¦¬ λ¨μλ₯Ό 볡μ μμ±νμ¬ λ³΅μμ μ²λ¦¬λ₯Ό λ³ννλ κ²μ΄λ€. μ€μ μ²λ¦¬ μ₯μΉμ μ²λ¦¬ μκ°μ λ§€μ° μ§§μ λ¨μλ‘ λΆν νμ¬ λ³΅μμ μ°λ λμ μ°¨λ‘λ‘ ν λΉν¨μΌλ‘μ¨ λ³΅μμ μ²λ¦¬κ° λμμ μ΄λ£¨μ΄μ§λ κ² μ²λΌ 보μΈλ€.
- λμμ 볡μ κ°μ μ½λκ° κ°μ μ£Όμ 곡κ°μμ μ€νλλ―λ‘μ μλ‘ κ°μνκ³ μν₯μ μ£Όλ©°, μ£Όμ κ³΅κ° λΆλ¦¬μ μ΄μ μ΄ μλ€.
- μ°λ λκ°μ μ€ν μμλ₯Ό μμΈ‘ν μ μμ΄ λλ²κΉ μ΄ μ΄λ ΅λ€.
- 곡μ μμμ 보νΈνκΈ° μ΄λ ΅λ€.
- λ©ν° μ°λ λλ μ°λ λκ°μ μ€ν μμκ° κ·μΉμ μ΄μ§ μμ λκΈ°νλ₯Ό ν΄μ£Όμ΄μΌ νλ€.
- νλ‘μΈμ€ λ΄μμλ§ μ¬μ©ν΄μΌνλ μ μ½μ΄ μμΌλ©°,
μκ³κ΅¬μ
νΉμμΉλͺ μ μμ
μ΄λΌκ³ νλ€. - λ€λ₯Έ μ°λ λμ μν΄ λ°©ν΄λ°μ§ λ§μμΌ ν μμ
μ ν λ, μ΄ μμμ ν¬λ¦¬ν°μ»¬ μΉμ
μΌλ‘ λλ¬μΈλ©΄
μ μμμμ λ μ κΆ
μ΄ μ£Όμμ§λ€.
λ°λλ½, μ¦ κ΅μ°© μν
λ λ©ν° μ°λ λ μ€ μ°λ λ κ°μ λκΈ° μνκ° μ’
λ£λμ§ μμ 무νμ λκΈ°λ§ νλ λΉμ μμ μΈ μν©μ΄λ€. κΈ°μ(Starvation)μλ λ€λ₯΄κ² μΈλΆμ μ‘°μΉ μμ΄λ λ²μ΄λ μ μλ€.
4κ°μ§ μμΈ μ€ νλλΌλ λΆμ κ°λ₯νλ€λ©΄ κ΅μ°© μνμ λΉ μ§μ§ μλλ€.
λ°°νμ μ¬μ©μ΄ μꡬλλ μμμ΄ μμΌλ©΄ κ΅μ°© μνκ° λ°μν μ μλ€.
νλ‘μΈμ€λ νμν μμ μ νμν μμμ λΆλΆμ μΌλ‘ ν보νκΈ°μ μ΄λ μμ μ νμν μμμ ν λΉλ°μ§ λͺ»νμ§λ§ ν보ν μμμ λμΉ μκ² λμ΄ κ΅μ°© μνκ° λ°μν μ μλ€.
μμμ΄ μ μ λΆκ°ν κ²½μ° κ΅μ°© μνκ° λ°μν μ μλ€.
μμμ 보μ ν μ±λ‘ μλ‘μ μμμ μμ²νκ²λλ©΄ κ΅μ°© μνκ° λ°μν μ μλ€.
- κ΅μ°© μνμ μμΈμ΄ λλ 쑰건 μ€ νλλ₯Ό μμ°μΌλ‘μ¨ κ΅μ°© μν λ°μμ λ°©μ§νλ λ°©λ²,Β κ΅μ°© μνλ₯Ό νμ€ν μ κ±°ν μ μμ§λ§ μ¬κ°ν μμ λλΉμ νΉμ νλ‘μΈμ€μ 무ν λκΈ° κ°λ₯μ±μ΄ μλ€.
- μμμ λ°°νμ μ¬μ©μ λ°°μ λ°°νμ μ¬μ©μ΄ νμν μμμ 곡μ ν κ²½μ° ν° λ¬Έμ λ₯Ό μΌκΈ°ν μ μλ€. λ°λΌμ λ°°μ ν μ μλ€.
- μμμ λΆλΆν λΉμ λ°°μ μμ μ΄ νμν λͺ¨λ μμμ 미리 ν λΉλ°μ μ€ννκ²λ νλ λ°©λ²μΌλ‘ μ¬κ°ν μμ λλΉλ₯Ό μ΄λνκ³ λ¬΄ν λκΈ°μ λΉ μ§ μ μλ€.
- μμμ μ μ λΆκ°λ₯μ±μ λ°°μ λͺ¨λ μμμ΄ μ μ κ°λ₯ν κ²½μ° λΉμ μμ μΈ νλ‘μΈμ€ μ’ λ£λ‘ μΈν μμ λλΉμ 무ν λκΈ°μ λΉ μ§ μ μλ€.
- μμμ νν λκΈ° μν©μ λ°°μ μμμ λν μ°μ μμλ₯Ό μ± μ νμ¬ νλ‘μΈμ€κ° μ΄ μ°μ μμλ₯Ό μ§μΌ μμ²νλλ‘ νλ λ°©λ², λ§μ°¬κ°μ§λ‘ μμμ λλΉμ 무ν λκΈ°λ₯Ό κ²ͺμ μ μλ€.
- νΉμ ν μκ³ λ¦¬μ¦μ ν΅ν΄ μμ€ν μ μνκ° μ§μμ μΌλ‘ μμ μνλ₯Ό μ μ§ν μ μλλ‘ μ‘°μ νλ λ°©λ², μμ μνλ κ΅μ°© μνκ° λ°μν μ μλ μνλ₯Ό μλ―Ένλ€. λκΈ° μνκ° κΈΈμ΄μ§ μ μμ§λ§Β μλ°©λ³΄λ€ μμμ λλΉλ₯Ό κ°μμν¬ μ μλ€.
- μνκ° μκ³ λ¦¬μ¦
-
μνκ° μκ³ λ¦¬μ¦μ΄ μ μμ μΌλ‘ μλνκΈ° μν΄μλ λ€μκ³Ό κ°μ μ μ κ° νμνλ€.
- μμ€ν λ΄μ νλ‘μΈμ€ μκ° κ³ μ λμ΄ μμ΄μΌ νλ€.
- μμμ μκ° κ³ μ λμ΄ μμ΄μΌ νλ€.
- κ° νλ‘μΈμ€κ° μꡬν μμμ μ΅λ κ°μλ₯Ό μμμΌ νλ€.
- κ° νλ‘μΈμ€λ ν λΉλ°μ μμμ μ¬μ©ν ν λ°λμ λ°λ©ν΄μΌ νλ€.
νλ‘μΈμ€μ μμ μμ²μ΄ μμ λ λ§λ€ μμ²μ λ°λ₯Έ ν λΉμ΄ μμ μνλ₯Ό μ μ§ν μ μλμ§ νμΈνλ€.Β μμ μνμ νλ¨μ ν μνμμ λͺ¨λ νλ‘μΈμ€κ° μ μμ μΌλ‘ μ’ λ£ν μ μλ κΈΈμ΄ μ μ΄λ νλ μ΄μ μλ κ²μ΄λ€.
-
- κ΅μ°© μνκ° λ°μνμμ λ κ·Έλ₯Ό νμ§νμ¬ μ‘°μΉ(볡ꡬ)λ₯Ό μ·¨νλ λ°©λ²μ΄λ€. νμ§λ₯Ό μν΄μλ ν μμ€ν μ μν©μ μμμΌνλλ° μμ ν λΉ κ·Έλν(Resource Allocation Graph, RAG)λ‘ λνλΈλ€.
- κ·Έλν μ κ±°λ²
- μ±ν¬(λκ°λ κ°μ μ΄ μλ νλ‘μΈμ€ λ Έλ, νλμ΄ κ°λ₯ν νλ‘μΈμ€)λ‘λΆν° μμνμ¬ λ€μ΄μ€λ λͺ¨λ κ°μ μ μ κ±°νλ€.(κ°μ§κ³ μλ μμμ λ°λ©) λͺ¨λ μ±ν¬μ λν΄μ κ°μ μμ μ μννμ λ κ°μ μ΄ λ¨μμμΌλ©΄ κ΅μ°© μνλ€.
- κ·Έλν νμλ²
- λκΈ° μν©μ λνλ΄λ κ°μ μ λ°λΌ μ§ννμ λ μ±ν¬κ° λ°κ²¬λλ©΄ κ΅μ°© μνκ° μμΌλ©° λͺ¨λ κ²½λ‘λ₯Ό νμν΄λ μ±ν¬κ° λ°κ²¬λμ§ μλλ€λ©΄ κ΅μ°© μνκ° μλ κ²μ΄λ€.μ¬μ΄ν΄μ λͺ¨λ μμμ΄ ν κ°μ© μμ λλ§ κ΅μ°© μνλ₯Ό λνλΈλ€.
-
**νλ‘μΈμ€μ μ’ λ£(Process Termination)**νΉμ νλ‘μΈμ€λ₯Ό μ’ λ£μμΌ μμμ ν보νλ λ°©λ²μΌλ‘ νλ‘μΈμ€λ₯Ό μ’ λ£μν¬ λ μ’ λ£ λΉμ©μ μ΅μννλ κ²μ΄ κ΄κ±΄μ΄λ€.
- μ’ λ£ λΉμ©μ΄ κ°μ₯ μ λ ΄ν νλμ νλ‘μΈμ€λ₯Ό μ’ λ£μν€λ λ°©λ²νλλ₯Ό μ’ λ£μν¬ λ λ§λ€ κ΅μ°© μνκ° μ κ±°λμλμ§ νμΈν΄μΌνλ€.
- λͺ¨λ λΆλΆ μ§ν©μ λ§λ€μ΄ μ’ λ£ λΉμ©μ΄ κ°μ₯ μ λ ΄ν νλμ λΆλΆ μ§ν©μ λͺ¨λ μ’ λ£μν€λ λ°©λ²λͺ¨λ λΆλΆ μ§ν©μ λν λΉμ©μ κ³μ°νκΈ°κ° λ³΅μ‘νκ³ νλ€λ€.
-
μμμ μ μ μ μν λ°©μ
μμμ μ μ μμΌ κ΅μ°© μνλ₯Ό ν΄μνλ λ°©λ²μΌλ‘ μ μ μΌλ‘ μΈν 볡ꡬ λΉμ©μ μ΅μννλ κ²μ΄ κ΄κ±΄μ΄λ€.
- κ²μ¬μ μ§μ (Checkpointing)νλ‘μΈμ€μ μ€ν μ€κ° μ€κ°μ κ²°κ³Όκ°μ μ μ₯ν΄λμ΄ λ³΅κ΅¬μ κ²μ¬μ μΌλ‘ 볡ꡬ
-
μΆμ²
https://onsil-thegreenhouse.github.io/programming/java/2018/05/23/java_tutorial_1-25/
https://velog.io/@ednadev/4.-μλ°-μ°λ λ-Thread-ydh851la
https://velog.io/@hyeon930/μ΄μ체μ -5.-κ΅μ°©-μνDeadlock