It's a bit outdated at this point, but I gained a lot from "Concurrent Programming in Java". It even goes into detail about how the JVM works, which is useful if you ever join a shop that uses a JVM-based language.
Coursera has a course that covers some very keen topics on parallel programming and concurrency. I'd be very happy if it also covered producer-consumer and executor patterns.
Finally, if you're looking for a much more hands-on approach, try learning Go. If you're familiar with C or another imperative language, it will not take long to make something runnable, maybe two weeks at most. The built in goroutines concept will help you understand the reason behind concurrent design and the pitfalls of managing shared memory among parallel processes.