Thanks so much for the reply.
This is the closest I have come to getting it to do what I want. It goes back and forth a couple times between the three methods in Mailbox3, but wait() never gets called in either of them. I also made a slightly altered version where the message is passed into another method, but control never escapes from the wait() in meth2().
I think the intent by the authors was to have both meth1() and meth2() be called by threads. And if my run() method is in Consumer4, I don't know how to call Mailbox3's methods without simply calling them with an instance of Mailbox3. In that case, they aren't threads, they're just ordinary method calls.