Java Multithreading Beginner's Guide (1): Threading Introduction
Java Multithreading Beginner's Guide (2): Creating Threads with the thread class
Java Multithreading Beginner's Guide (3): Creating a thread using the Runnable interface
Java Multithreading Beginner's Guide (4): Thread lifecycle
Java Multithreading Beginner's Guide (5): Use of Join methods
Java Multithreading Beginner's Guide (6): Careful use of the volatile keyword
Java Multithreading Beginner's Guide (7): Three ways to pass data to a thread
Java Multithreading Beginner's Guide (8): Two ways to return data from a thread
Java Multithreading Beginner's Guide (9): Why Data synchronization
Java Multithreading Beginner's Guide (10): Using the Synchronized keyword to synchronize class methods
Java Multithreading Beginner's Guide (11): Using synchronized block synchronization method
Java Multithreading Beginner's Guide (12): Using synchronized block to synchronize variables