SimpleThreadPool에 대한 질문
214
작성한 질문수 12
아래 코드에서 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문은 동시성 프로그래밍에서 공유 자원에 대한 접근이 여러 스레드에 의해 이루어질 때, 작업을 안전하게 처리하기 위한 중요한 역할을 합니다.
1
아 네 맞습니다.
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/스레드-풀-이해와-구현-예시코드-버그
를 참조해 주십시오
멀티스레드 단일스레드
0
56
0
new Condition 부분 질문
0
83
1
13:00 강의 내용 이해 질문
0
99
1
강의 출시 질문 있습니다.
0
117
1
InterruptedExceptionThreadStopExample 질문입니다.
0
94
2
instance.getMyField()의 값이 왜 다른가요?
0
115
1
해당 강의 내용 무단 도용 신고
0
211
2
Thread Waiting 상태 관련 질문 드립니다.
0
186
1
단일연산변수 api
0
126
0
synchronized 블럭과 메인메모리 반영
0
147
0
실무에서 자바가 제공하는 락을 사용하는 경우
1
243
1
뮤텍스나 세마포어는 busy waiting이 없는 게 맞을까요?
0
159
1
16:50부분에서 타입락 질문드립니다.
0
110
2
16분 7초 뮤텍스 코드 관련해 질문드립니다.
0
160
2
동기화가 보장된다고 하더라도 스레드간 데이터 불일치가 발생할 수 있지 않나요??
0
199
2
리액티브-part2
0
180
2
문자열 풀 값을 이용한 String 변수
0
207
2
스레드 라이브러리는 커널과 같은 역할을 하지 못하나요?
0
173
1
자식 프로세스를 쓰는 이유
0
186
1
커널 모드 전환시 질문이 있습니다!
0
146
1
[공유] setName 시 threadName이 1부터 시작하는 이유
0
178
1
synchronized = 모니터
0
285
2
Thread의 Context Switching 문의드립니다.
1
257
1
동기 & 논블록킹 질문 드립니다.
0
232
2





