인프런 커뮤니티 질문&답변

이민준님의 프로필 이미지
이민준

작성한 질문수

자바 동시성 프로그래밍 [리액티브 프로그래밍 Part.1]

Executor

SimpleThreadPool에 대한 질문

작성

·

155

0

아래 코드에서 if이 왜 필요한지 궁금합니다.

while문을 빠져나왔다는것은 이미 taskQueue가 비어있지않단는 뜻 아닌가요?

 

synchronized (taskQueue) {
    while (taskQueue.isEmpty() && !isShutdown) {
        try {
            taskQueue.wait(); // 작업이 있을 때까지 대기
        } catch (InterruptedException e) {
            Thread.currentThread().interrupt();
        }
    }
    if (!taskQueue.isEmpty()) {
        task = taskQueue.poll(); // 작업 큐에서 작업 가져옴
    } else {
        continue; // 작업이 없으면 다시 대기
    }
}

답변 1

0

안녕하세요, 인프런 AI 인턴입니다.

if문은 taskQueue가 비어있지 않을 때 작업을 가져오기 위해 필요합니다. while문 내부에서 taskQueue가 비어있지 않다는 것을 확인하고 대기 상태에서 벗어날 수 있지만, taskQueue.wait() 호출 후 다른 스레드가 taskQueue에 접근하여 작업을 모두 가져가 taskQueue가 다시 비었을 경우를 대비해야 합니다. 이 경우, 현재 스레드가 대기 상태에서 깨어났지만 실제로 처리할 작업이 없다는 것을 의미할 수 있기 때문에, if (!taskQueue.isEmpty()) 조건을 통해 해당 상황을 처리하고, 작업이 있을 경우에만 taskQueue.poll()을 통해 작업을 가져오도록 하기 위해 사용됩니다. 반면, 작업이 없으면 continue를 통해 다시 대기 상태로 돌아가 작업이 추가될 때까지 기다립니다.

이렇게 if문은 동시성 프로그래밍에서 공유 자원에 대한 접근이 여러 스레드에 의해 이루어질 때, 작업을 안전하게 처리하기 위한 중요한 역할을 합니다.

이민준님의 프로필 이미지
이민준
질문자

이해가안되네요. 모니터를 얻은 스레드만이 큐에 접근할 수 있고 이미 taskQueue가 비어있지않으므로 while문을 빠져나온건데, 왜 필요한건가요.

정수원님의 프로필 이미지
정수원
지식공유자

아 네 맞습니다.

if (!taskQueue.isEmpty()) 가 굳이 필요없습니다.

 

초기 코드가
synchronized (taskQueue) {

while (taskQueue.isEmpty() && !isShutdown) {

try {

taskQueue.wait(); // 작업이 있을 때까지 대기

} catch (InterruptedException e) {

Thread.currentThread().interrupt();

}

}

}

if (!taskQueue.isEmpty()) {

task = taskQueue.poll(); // 작업 큐에서 작업 가져옴

} else {

continue; // 작업이 없으면 다시 대기

}

 

에서 동기화 문제가 발생해서 다시

synchronized (taskQueue) {

while (taskQueue.isEmpty() && !isShutdown) {

try {

taskQueue.wait(); // 작업이 있을 때까지 대기

} catch (InterruptedException e) {

Thread.currentThread().interrupt();

}

}

if (!taskQueue.isEmpty()) {

task = taskQueue.poll(); // 작업 큐에서 작업 가져옴

} else {

continue; // 작업이 없으면 다시 대기

}

}

로 고친 겁니다. 그 과정에서 if (!taskQueue.isEmpty()) 을 그대로 두었는데 없어도 됩니다.

https://www.inflearn.com/questions/1119158/스레드-풀-이해와-구현-예시코드-버그

를 참조해 주십시오

이민준님의 프로필 이미지
이민준

작성한 질문수

질문하기