반응형
package multi_thread.thread_status;
public class ThreadA extends Thread{
public boolean stop = false; // 종료 플래그
public boolean work = true ; // 작업 진행 여부 플래그
public void run() {
while(!stop) {
if(work) {
System.out.println("ThreadA 작업 내용");
} else {
Thread.yield(); // 실행 대기 상태 만들기
}
}
System.out.println("ThreadA 종료");
}
}
package multi_thread.thread_status;
public class ThreadB extends Thread {
public boolean stop = false; // 종료 플래그
public boolean work = true ; // 작업 진행 여부 플래그
public void run() {
while(!stop) {
if(work) {
System.out.println("ThreadB 작업 내용");
} else {
Thread.yield(); // 실행 대기 상태 만들기
}
}
System.out.println("ThreadB 종료");
}
}
package multi_thread.thread_status;
public class YieldExample {
public static void main(String[] args) {
ThreadA threadA = new ThreadA();
ThreadB threadB = new ThreadB();
threadA.start();
threadB.start();
try {Thread.sleep(1000);} catch (InterruptedException e) {}
threadA.work = false;
try {Thread.sleep(1000);} catch (InterruptedException e) {}
threadA.work = true;
try {Thread.sleep(1000);} catch (InterruptedException e) {}
threadA.stop = true;
threadB.stop = true;
// thread.stop() 이라는 메소드가 존재하지만 강제로 종료하는 거이기 때문에 스레드가 살아있을 수가 있기 때문에 플래그값을 변경해 스레드 자체를 정상 종료시키는게 더 좋은 방법
}
}
yield() 메소드는 호출한 스레드를 실행 대기 상태로 돌아가 다른 스레드가 실행 기회를 가질 수 있게 도와줍니다.
(동일 또는 높은 우선순위의 스레드)
여기에서 ThreadA, B가 번갈아가면서 사용하지만 ThreadA의 work 값이 false가 되면 아무 이유 없는 무한루프를 반복합니다.
멀티스레드가 정말 병렬처리라면 상관 없는데 번갈아가면서 사용하는 거기 때문에(싱글코어 일시 = CPU1개) Thread A가 의미 없는 짓을 할 때 동안 ThreadB는 사용을 못하게 되는 것이죠 그걸 yield()메소드를 이용해 ThreadB가 계속적으로 사용될 수 있게 ThreadB가 의미 없는짓 할 땐 ThreadA가 쓰게 되면 번갈아 가면서 안 써도 되니까 속도가 더 빨라지겠죠?
반응형
'[Java] > [Java]' 카테고리의 다른 글
[Java] 자바 멀티스레드 [Multi-Thread] 스레드 번갈아 실행시키기[공유객체] (wait(), notify()) (0) | 2021.08.05 |
---|---|
[Java] 자바 멀티스레드 [Multi-Thread] 스레드 일시 중지 또는 중지 (join() (0) | 2021.08.05 |
[Java] 자바 멀티스레드 [Multi-Thread] 공유 객체 임계영역 설정 (synchronized) (0) | 2021.08.04 |
[Java] 자바 멀티스레드 [Multi-Thread] 스레드 우선순위설정하기 (0) | 2021.08.04 |
[Java] 자바 멀티스레드 [Multi-Thread] 스레드 이름 설정하기 (setName, getName) (0) | 2021.08.04 |