`flush if q.full?` is not atomic, is that okay in this case, it may be possible that `if q.full?` gets called and then another thread interrupts