Replies: 1 comment
-
|
정답 ② 해설: interrupt()를 호출했다고 즉시 InterruptedException이 발생하는 것은 아닙니다. sleep()처럼 InterruptedException을 던지는 메서드를 호출하거나 호출 중일 때 예외가 발생합니다. ③ 해설: Thread.interrupted()는 인터럽트 상태를 확인하고 true이면 false로 변경합니다. isInterrupted()는 상태만 확인하고 변경하지 않습니다. ② 해설: sleep(3000)으로 3초간 TIMED_WAITING 상태에 있기 때문에, runFlag가 변경되어도 3초가 지나야 while 조건을 다시 체크할 수 있습니다. ① 해설: volatile 키워드는 여러 스레드가 동시에 접근하는 변수의 가시성(visibility)을 보장하여 메모리 동기화 문제를 해결합니다. ② 해설: isInterrupted()는 인터럽트 상태를 변경하지 않으므로, 인터럽트 상태가 true로 유지되어 자원 정리 중 Thread.sleep(1000)에서 InterruptedException이 발생할 수 있습니다. ③ 해설: yield()는 스케줄러에게 힌트만 제공할 뿐, 강제적으로 다른 스레드에게 실행 기회를 넘기는 것은 아닙니다. ① 해설: jobQueue가 비어있을 때 무한 반복하면서 CPU를 계속 사용하게 되므로, yield()를 호출하여 다른 스레드에게 CPU를 양보함으로써 전체적인 효율을 높입니다. ② 해설: 여러 스레드가 동시에 접근하는 경우 일반 컬렉션은 안전하지 않으므로, 동시성을 지원하는 ConcurrentLinkedQueue를 사용해야 합니다. ① 해설: work=false는 while(work) 조건 체크 시점에 반응하고, interrupt()는 sleep() 등의 대기 상태에서 즉시 깨어나도록 합니다. 두 가지를 함께 사용하면 반응성이 좋아집니다. ③ 해설: 대기 상태(Waiting)는 WAITING이나 TIMED_WAITING 같은 별도의 스레드 상태입니다. RUNNABLE 상태의 세부 상태는 실행 상태(Running)와 실행 대기 상태(Ready)입니다. |
Beta Was this translation helpful? Give feedback.
Uh oh!
There was an error while loading. Please reload this page.
Uh oh!
There was an error while loading. Please reload this page.
-
스레드 제어와 생명 주기2 - 연습 문제문제
1번. 다음 중 인터럽트에 대한 설명으로 옳지 않은 것은?
① 인터럽트를 사용하면 WAITING, TIMED_WAITING 상태의 스레드를 RUNNABLE 상태로 만들 수 있다
② interrupt() 메서드를 호출하면 즉시 InterruptedException이 발생한다
③ sleep() 같은 메서드를 호출 중일 때 인터럽트가 발생하면 InterruptedException이 발생한다
④ 인터럽트 예외가 발생하면 스레드의 인터럽트 상태는 false로 변경된다
2번. Thread.interrupted()와 isInterrupted()의 차이점으로 옳은 것은?
① Thread.interrupted()는 인터럽트 상태를 변경하지 않지만, isInterrupted()는 false로 변경한다.
② 둘 다 인터럽트 상태를 false로 변경한다
③ Thread.interrupted()는 인터럽트 상태를 false로 변경하지만, isInterrupted()는 변경하지 않는다
④ 둘 다 인터럽트 상태를 변경하지 않는다
3번. 다음 코드에서 work 스레드가 작업 중단 지시를 받은 후에도 즉각 반응하지 않는 이유는?
① runFlag가 volatile로 선언되지 않아서
② sleep(3000)으로 3초간 대기 상태에 있기 때문에
③ while문의 조건 체크가 느려서
④ 메모리 동기화 문제 때문에
4번. 다음 중 volatile 키워드의 용도로 옳은 것은?
① 여러 스레드가 동시에 접근하는 변수의 가시성을 보장한다
② 스레드를 일시 정지시킨다
③ 스레드 간 동기화 락을 제공한다
④ 스레드의 우선순위를 설정한다
5번. 인터럽트를 처리할 때 다음과 같이 코드를 작성하면 어떤 문제가 발생하는가?
① 컴파일 에러가 발생한다
② 인터럽트 상태가 true로 유지되어 자원 정리 중에도 인터럽트 예외가 발생할 수 있다
③ 스레드가 즉시 종료된다
④ 아무 문제가 없다
6번. Thread.yield()에 대한 설명으로 옳지 않은 것은?
① 현재 스레드가 CPU를 양보하도록 힌트를 제공한다
② 호출한 스레드는 RUNNABLE 상태를 유지한다
③ 반드시 다른 스레드에게 실행 기회가 넘어간다
④ 양보할 스레드가 없으면 본인 스레드가 계속 실행될 수 있다
7번. 프린터 예제에서 다음 코드에 Thread.yield()를 추가하는 이유는?
① jobQueue가 비어있을 때 CPU 자원 낭비를 줄이기 위해
② 스레드를 완전히 정지시키기 위해
③ 인터럽트를 빨리 감지하기 위해
④ 메모리 동기화를 위해
8번. 다음 중 ConcurrentLinkedQueue를 사용하는 이유는?
① 일반 큐보다 성능이 좋아서
② 여러 스레드가 동시에 접근할 때 안전성을 보장하기 위해
③ 메모리를 적게 사용하기 위해
④ 자동으로 정렬되기 때문에
9번. 스레드 종료 시 다음과 같이 두 가지를 함께 사용하는 이유는?
① work=false는 while문 체크 시점에, interrupt()는 sleep() 상태에서 빠져나오기 위해
② 두 번 호출해야 확실히 종료되기 때문에
③ 컴파일러 최적화를 위해
④ 디버깅을 쉽게 하기 위해
10번. RUNNABLE 상태의 스레드가 운영체제 수준에서 가질 수 있는 세부 상태가 아닌 것은?
① 실행 상태(Running)
② 실행 대기 상태(Ready)
③ 대기 상태(Waiting)
④ 위 모두 RUNNABLE의 세부 상태이다
Beta Was this translation helpful? Give feedback.
All reactions