작성
·
56
0
Waiting
상태의 쓰레드를 Runnable
상태로 만들기 위해선 두 가지 방법이 있다고 배웠습니다.
LockSupport 기능
인터럽트 발생
2번 방법에 대해서 궁금한 것이 있습니다. 결과적으로 인터럽트를 발생시켜 쓰레드를 대기 상태에서 실행 가능한 상태로 전이시킨다는 것인데 인터럽트 상태가 정상(false)이 아닌 상태가 나오게 되는데 그럼 실무에서 1번 방법을 더 많이 사용하나요?
답변 1
0
안녕하세요, 인프런 AI 인턴입니다. spring님.
스레드를 WAITING
상태에서 RUNNABLE
상태로 전환하는 방법에 대한 질문을 주셨네요. 두 가지 방법에 대해 간단히 설명드리겠습니다.
LockSupport.unpark(thread)
: 이 방법은 특정한 스레드를 잠금 없이 일으킬 수 있는 방법입니다. unpark
를 호출하면 지정한 스레드는 WAITING
상태에서 RUNNABLE
상태로 전이됩니다. 인터럽트 플래그와는 무관하게 작동하며, 가볍고 효율적입니다.thread.interrupt()
를 호출하면, WAITING
상태의 스레드에서 InterruptedException
이 발생하게 됩니다. 이 방법은 스레드의 인터럽트 상태를 true
로 설정하지만, 스레드가 대기 상태를 벗어나는 동작은 명시적으로 스레드가 코드에서 이를 감지하고 처리해야 합니다. InterruptedException
을 캐치하여 처리할 수 있으며, 이는 다소 추가적인 코드가 필요하게 됩니다.실무에서는 왜 하나의 방법을 더 선호할지 이해하기 위해서는 각 방법의 장단점을 고려해야 합니다.
LockSupport.unpark
의 장점: 성능이 우수하고, 인터럽트 플래그를 변경하지 않기 때문에 다른 메커니즘에 영향을 주지 않는 깔끔한 방법입니다.
인터럽트의 단점: InterruptedException
을 발생시키기 때문에 실행 흐름에 영향을 주고 추가적인 코드를 작성해 처리해야 합니다. 또한, 불필요하게 인터럽트 플래그가 true
가 될 수 있습니다.
따라서, 상황에 따라 적절한 방법을 선택하는 것이 좋습니다. 인터럽트가 가장 표준적인 방법으로 알려져 있지만, LockSupport를 통해 좀 더 미세한 제어가 필요한 경우엔 LockSupport를 활용할 수 있습니다.
관련 질문 및 설명이 포함된 게시물을 보려면 다음 링크를 참고해 주세요:
- 실전 자바 - LockSupport와 인터럽트 비교
저는 질문자님의 이해를 돕고자 지식공유자님의 기존 답변을 참고하여 유사한 답변 링크를 추천해드리고 있습니다. 현재 베타 기능으로 답변이 만족스럽지 않을 수 있는 점 양해 부탁드립니다. 🙏 추가적으로 궁금한 점이 있으시면, 이어서 질문해 주세요. 곧 지식공유자께서 답변해 주실 것입니다.