Extend the `Thread` class
Override the `run()` method
Create an object of the subclass
Call the `start()` method on the object
Implement the `Runnable` interface
Override the `run()` method
Create an object of the class
Pass the object to a `Thread` constructor
Call the `start()` method on the `Thread` object
Use a lambda expression with `Runnable`
Create a `Thread` with the lambda
Call the `start()` method
Use an `ExecutorService`
Submit a `Runnable` or `Callable` task
Manage threads through the executor
Use `Callable` with `Future`
Create a `Callable` task
Submit it to an executor
Retrieve the result from `Future`
