Java Threads: Understanding and Mastering Concurrent Programming