by Scott Oaks and Henry Wong
This book shows you how to take advantage of Java's thread facilities:
where to use threads to increase efficiency, how to use them effectively,
and how to avoid common mistakes. It covers the Thread and
ThreadGroup classes, the Runnable interface, and the language's
synchronized operator, as well as problems like deadlock, race conditions,
and starvation.
by This is the best book available on multi-threaded programming, but it's a little tough going in parts.