I used `drained` instead of checking `isEmpty` because I wasn't absolutely sure if it's (currently in the codebase or in the future) possible for new events to be posted after this stop method was called. If it is possible, then checking `isEmpty` is not enough to imply that the end-of-work / drain signal has been reached, and that although we enforce a semantics that ignores such events we can't really prevent them? 

As for 2nd point: after a bit googling it seems synchronizing on a thread-safe queue can cause issues using the queue.