Processes contain threads. Threads are lightweight processes that are handled by the JVM instead of by the operating system.
The sleep() method is declared to be static, which means that there is only one copy of this method and that it resides at the class level. As a result, you can call it with either a handle to an instance or the name of the class. The preferred approach is to call it with the name of the class.
The synchronize keyword signals that locks should be used to allow only one thread at the time to access a method.
The simple join() method will wait forever for another process to finish. The version that takes a parameter n will time out after n milliseconds and resume the thread's execution, with or without the other thread finishing.