By using the Real-time Specification for Java (RTSJ), developers can eliminate unpredictable latencies introduced by the garbage collector, exercise full control over thread priorities, and handle asynchronous events with ease. This paper identifies the drawbacks of deploying conventional Java in a real-time system and how the RTSJ solves them. Using working code examples, we explore all the new classes that a Java Virtual Machine (JVM) supporting the RTSJ provides. The paper also examines recent work on safety-critical profiles of the RTSJ and the use of tools for correctness verification.