q = Queue.new l = Mutex.new Thread.new { sleep 0.5 q << 1 q << 2 q << 3 sleep 0.5 q.close } until q.closed? && q.empty? p [q.closed?, q.empty?] p q.pop p [q.closed?, q.empty?] end