Low level producer-consumer.
Implementing produce and consume methods.
Putting producer-consumer processing into synchronized blocks.