The Java TM Tutorial

| Start of Tutorial > Start of Trail > Start of Lesson | Search

Trail: Essential Java Classes
Lesson: Doing Two or More Tasks At Once: Threads

## Subclassing Thread and Overriding run

> The first way to customize what a thread does when it is running is to subclass `Thread` (itself a `Runnable` object) and override its empty `run` method so that it does something. Let's look at the `SimpleThread` class, the first of two classes in this example, which does just that:

> >     public class SimpleThread extends Thread {
> >         public SimpleThread(String str) {
> >             super(str);
> >         }
> >         public void run() {
> >             for (int i = 0; i < 10; i++) {
> >                 System.out.println(i + " " + getName());
> >                 try {
> >                     sleep((long)(Math.random() * 1000));
> >                 } catch (InterruptedException e) {}
> >             }
> >             System.out.println("DONE! " + getName());
> >         }
> >     }

> The first method in the `SimpleThread` class is a constructor that takes a `String` as its only argument. This constructor is implemented by calling a superclass constructor and is interesting to us only because it sets the `Thread`'s name, which is used later in the program.

> The next method in the `SimpleThread` class is the `run` method. The `run` method is the heart of any `Thread` and where the action of the `Thread` takes place. The `run` method of the `SimpleThread` class contains a `for` loop that iterates ten times. In each iteration the method displays the iteration number and the name of the `Thread`, then sleeps for a random interval of up to 1 second. After the loop has finished, the `run` method prints `DONE!` along with the name of the thread. That's it for the `SimpleThread` class.

> The `TwoThreadsTest` class provides a `main` method that creates two `SimpleThread` threads: one is named "Jamaica" and the other is named "Fiji". (If you can't decide on where to go for vacation you can use this program to help you decide--go to the island whose thread prints "DONE!" first.)

> >     public class TwoThreadsTest {
> >         public static void main (String[] args) {
> >             new SimpleThread("Jamaica").start();
> >             new SimpleThread("Fiji").start();
> >         }
> >     }

> The `main` method also starts each thread immediately following its construction by calling the `start` method. To save you from typing in this program, click here for the source code to the `SimpleThread` class and here for the source code to the `TwoThreadsTest` program. Compile and run the program and watch your vacation fate unfold. You should see output similar to the following:

> >     0 Jamaica
> >     0 Fiji
> >     1 Fiji
> >     1 Jamaica
> >     2 Jamaica
> >     2 Fiji
> >     3 Fiji
> >     3 Jamaica
> >     4 Jamaica
> >     4 Fiji
> >     5 Jamaica
> >     5 Fiji
> >     6 Fiji
> >     6 Jamaica
> >     7 Jamaica
> >     7 Fiji
> >     8 Fiji
> >     9 Fiji
> >     8 Jamaica
> >     DONE! Fiji
> >     9 Jamaica
> >     DONE! Jamaica

> (Looks like I'm going to Fiji!!) Notice how the output from each thread is intermingled with the output from the other. This is because both `SimpleThread` threads are running concurrently. Thus, both `run` methods are running at the same time and each thread is displaying its output at the same time as the other.

> > Try This: Change the main program so that it creates a third thread with the name "Bora Bora". Compile and run the program again. Does this change the island of choice for your vacation? Here's the code for the new main program, which is now named `ThreeThreadsTest`.

> Now, let's look at another example, the `Clock` applet, that uses the other technique for providing a `run` method to a `Thread`.

| Start of Tutorial > Start of Trail > Start of Lesson | Search