작성
·
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
문은 동시성 프로그래밍에서 공유 자원에 대한 접근이 여러 스레드에 의해 이루어질 때, 작업을 안전하게 처리하기 위한 중요한 역할을 합니다.
아 네 맞습니다.
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/스레드-풀-이해와-구현-예시코드-버그
를 참조해 주십시오
이해가안되네요. 모니터를 얻은 스레드만이 큐에 접근할 수 있고 이미 taskQueue가 비어있지않으므로 while문을 빠져나온건데, 왜 필요한건가요.