join() 메서드를 통해 Waiting (대기 상태) : 스레드가 다른 스레드의 특정 작업이 완료되기를 무기한 기다리는 상태이다.
import static util.MyLogger.log;
import static util.ThreadUtils.sleep;
public class JoinMainV0 {
public static void main(String[] args) {
log("Start");
Thread thread1 = new Thread(new Job(), "thread-1");
Thread thread2 = new Thread(new Job(), "thread-2");
thread1.start();
thread2.start();
log("End");
}
static class Job implements Runnable {
@Override
public void run() {
log("작업시작");
sleep(2000);
log("작업종료");
}
}
}
thread1과 thread2는 각각 수행한다.
main thread는 thread 1, thread2를 실행하고 자신의 다음 코드를 실행한다. 끝까지 기다려주지 않는다. 단지 start만 호출해서 다른 스레드를 실행하게 하고 main의 다음 코드를 실행한다.
만약 main thread가 thread1, thread2가 끝난 뒤에 그 결과를 받아서 처리 하고 싶다면 Join을 써보자.
CPU 코어를 더 효율적으로 사용하려 면 여러 스레드로 나누어 계산하면 된다.
1~100까지 더한다 가정 했을때, 나눠서 하는 것이다. 그러면 CPU 코어가 많아질수록 나눠서 사용하여 연산 속도가 빨라진다.
가장 쉬운 방법으로 다른 thread들 보다 main thread를 sleep을 더 길게 주는 것이다. 하지만 이러한 것은 리소스 낭비가 될 수 있다.
다음으로는 Join 을 사용하는 법이다.
import static util.MyLogger.log;
import static util.ThreadUtils.sleep;
public class JoinMainV3 {
public static void main(String[] args) throws Exception {
log("Start");
SumTask task1 = new SumTask(1, 50);
SumTask task2 = new SumTask(51, 100);
Thread thread1 = new Thread(task1, "thread-1");
Thread thread2 = new Thread(task2, "thread-2");
thread1.start();
thread2.start();
log("join() - main 스레드가 thread1, thread2 종료까지 대기");
thread1.join();
thread2.join();
log("main 스레드 대기 완료");
log("task1.result = " + task1.result);
log("task2.result = " + task2.result);
int sumAll = task1.result + task2.result;
log("task1 + task2 = " + sumAll);
log("End");
}
static class SumTask implements Runnable {
int StartV;
int EndV;
int result =0;
public SumTask(int StartV, int endV) {
this.StartV = StartV;
EndV = endV;
}
@Override
public void run() {
log("작업 시작");
sleep(2000);
int sum = 0;
for (int i = StartV; i <= EndV; i++) {
sum
+= i;
}
result
= sum;
log("작업 완료 result=" + result);
}
}
}
thread1.join() 코드 안에서 더는 진행하지 않고 멈추어 기다린다. 이후에 thread1 이 종료되면 main 스레드는 RUNNABLE 상태가 되고 다음 코드로 이동한다. 그다음은 thread2에서 또 기다리게 된다. 둘 다 2 sec이라 2초면 두 개 다 끝나서 thread 1-> 2로 갔을 때 2도 끝나있어서 거의 동시에 끝나는 것처럼 보인다.
Waiting (대기 상태) : 스레드가 다른 스레드의 특정 작업이 완료되기를 무기한 기다리는 상태이다.
그래서 중간에 멈추지 못하고 무기한 기다려야하는 단점이 있다. 그래서 일정 시간 동안만 기다리고 싶다면 다르게 코드를 작성해야 한다.
thread1.join(1000);
이런 식으로 코드를 수정하면 된다.
'운영체제' 카테고리의 다른 글
Volatile - 메모리가시성 (0) | 2024.12.15 |
---|---|
Thread - interrupt (0) | 2024.12.14 |
체크 예외 재정의 (1) | 2024.11.29 |
Thread 생명 주기 - 코드 (0) | 2024.11.29 |
Thread 생명 주기 개념편 (0) | 2024.11.29 |