Yes, it is necessary. If the queue is empty, this String msg = queue.take(); statement String msg = queue.take(); will be blocked until the item is queued or interrupted.
If you want to guarantee that the thread does not hang, you need to interrupt it.
However, it seems to crash: if reservations not 0 when you call the close method and the queue is empty, it seems that your loop will continue to work and hang on queue.take() in the while loop iterate after interruption.
source share