Java provides two ways to create and run a thread. You can implement the Runnable interface or extend the Thread class. The Runnable interface defines a single method run(). Consider the following example of a class that extends the Runnable interface:
1. Class RunnableClass implements Runnable {2. // Class attributes and methods3. 4. public void run() {5. // Code for the run() method6. }7. }
This thread can be started from another section of the program as follows:
8. RunnableClass rc = new RunnableClass();9. Thread t = new Thread(rc);10. rc.start(); 11. // Other code
The start() method calls the run() method on Line 4. Program control returns to Line 11 and simultaneously to Line 5. At this point two threads are executing.
The Thread class can also be extended directly, making the derived class a Runnable (Thread extends Runnable):
1. public class ThreadClass extends Thread {2. public void run() {3. // Code here4. }5. }
In this case, the thread may be started directly with a single call:
6. ThreadClass tc = new ThreadClass();7. tc.start();
The Thread class has a lot more overhead (in terms of methods and attributes) and most of the time the developers only need to use the run() method. As a result, implementing Runnable is the preferred way to use threads.