Write code to define, instantiate, and start new threads using both java.lang.Thread and java.lang.Runnable .
Recognize conditions that might prevent a thread from executing.
Write code using synchronized , wait() , notify() , and notifyAll() to protect against concurrent access problems and to communicate between threads.
Define the interaction among threads and object locks when executing synchronized wait( ), notify() , or notifyAll() .
Understand thread states and the transitions between them.