Notice
Recent Posts
Recent Comments
Link
개발 무지렁이
[Java] CPU스케쥴링에 따른 스레드(Thread) 상태와 상태 이동 메서드 본문
➼ 🦔 스레드(Thread) 이름 지정
thread.setName("[스레드 이름]")
⚠️ 스레드 이름을 지정하지 않으면 "Thread-n"
⭐ 어떤 스레드가 현재 코드를 실행하고 있는지 check
Thread thread = Thread.currentThread();
System.out.println(thread.getName());
⚠️ 스레드 이름을 지정하지 않으면 "Thread-n"
⭐ 어떤 스레드가 현재 코드를 실행하고 있는지 check
Thread thread = Thread.currentThread();
System.out.println(thread.getName());
𐁍 스레드 상태
⚠️ 스레드 객체를 생성하고, start() 메서드를 호출하면, 바로 스레드가 실행되는 것이 아니다.
실행대기상태(RUNNABLE)로 넘어가고,
CPU 스케쥴링에 따라, 해당 스레드가 CPU를 점유할 때 run() 메서드를 실행한다.
이 때 실행상태(RUNNING)가 되며, 스레드는 RUNNABLE과 RUNNING을 번갈아가며
run() 메서드를 조금씩 실행해나간다.
run() 메서드가 종료되면 더이상 실행할 코드가 없어 종료상태(TERMINATED) 상태가 된다.
⚠️ RUNNING에서 가끔 일시정지상태(SUSPENDED)로 가기도 하는데
SUSPENDED는 스레드가 실행할 수 없는 상태를 말한다.
🙈 SUSPENDED로 가는 Method:
sleep()
join() [다른 스레드의 run()메서드가 종료될 때까지, SUSPENDED]
wait() [동기화 블록내에서 스레드를 SUSPENDED]
🙉 SUSPENDED에서 벗어나는 Method:
interrupt() [InterruptedException을 발생 -> RUNNABLE or TERMINATED]
notify(), notifyAll() [wait() 메서드로 인해 SUSPENDED -> RUNNABLE]
🙊 RUNNABLE로 가는 Method:
yield() [RUNNING -> 다른 스레드에게 실행을 양보, RUNNABLE]
실행대기상태(RUNNABLE)로 넘어가고,
CPU 스케쥴링에 따라, 해당 스레드가 CPU를 점유할 때 run() 메서드를 실행한다.
이 때 실행상태(RUNNING)가 되며, 스레드는 RUNNABLE과 RUNNING을 번갈아가며
run() 메서드를 조금씩 실행해나간다.
run() 메서드가 종료되면 더이상 실행할 코드가 없어 종료상태(TERMINATED) 상태가 된다.
⚠️ RUNNING에서 가끔 일시정지상태(SUSPENDED)로 가기도 하는데
SUSPENDED는 스레드가 실행할 수 없는 상태를 말한다.
🙈 SUSPENDED로 가는 Method:
sleep()
join() [다른 스레드의 run()메서드가 종료될 때까지, SUSPENDED]
wait() [동기화 블록내에서 스레드를 SUSPENDED]
🙉 SUSPENDED에서 벗어나는 Method:
interrupt() [InterruptedException을 발생 -> RUNNABLE or TERMINATED]
notify(), notifyAll() [wait() 메서드로 인해 SUSPENDED -> RUNNABLE]
🙊 RUNNABLE로 가는 Method:
yield() [RUNNING -> 다른 스레드에게 실행을 양보, RUNNABLE]
🏓 join() ex.
📜 SumThread.java
public class SumThread extends Thread {
private long sum;
public long getSum() {
return sum;
}
public void setSum(long sum) {
this.sum = sum;
}
@Override
public void run() {
for(int i = 1; i <= 100; i++) {
sum += i;
}
}
}
📜 JoinExample.java
public class JoinExample {
public static void main(String[] args) {
SumThread sumTread = new SumTread();
sumThread.start();
try {
sumThread.join();
} catch (InterruptedException e) { }
System.out.println("1~100 합: " + sumThread.getSum());
// 1~100 합: 5050
}
}
🏓 yield() ex.
📜 WorkThread.java
public class WorkThread extends Thread {
public boolean work = true;
public WorkThread(String name) {
setName(name);
}
@Override
public void run() {
while(true) {
if(work) {
System.out.println(getName() + " 작업처리");
} else {
Thread.yield();
}
}
}
}
📜 WorkThread.java
public class YieldExample {
public static void main(String[] args) {
WorkThread workThreadA = new WorkThread("workThreadA"); WorkThread workThreadB = new WorkThread("workThreadB"");
workThreadA.start();
workThreadB.start();
try {
Thread.sleep(5000);
} catch (InterruptedException e) { }
workThreadA.work = false;
try {
Thread.sleep(10000);
} catch (InterruptedException e) { }
workThreadA.work = true;
}
}
'Backend > 자바' 카테고리의 다른 글
[Java] 스레드 정상 실행 종료, interrupt( ): 리소스 정리 후 실행 종료 (0) | 2023.08.13 |
---|---|
[Java] 공유객체 내부데이터에 대한 스레드 동기화와 정확한 작업교대 (0) | 2023.08.13 |
[Java] 하나의 프로세스 안의 멀티스레드(메인스레드 + 多 작업스레드)의 구현 (0) | 2023.08.12 |
[Java] 타입파라미터를 가지는 제네릭 타입 및 제네릭 메서드 (0) | 2023.08.12 |
[Java] 어노테이션과 어노테이션 적용대상 및 유지정책 (0) | 2023.08.12 |
Comments