HowToMakeThreadsInJava

Last edit May 9, 2003
	new Thread();

Next question?
How to create threaded behaviors in Java?

Answer 1: Extend Thread (this is rarely used):
	class MyThread extends Thread {
		public void run() { 
		// ... 
	}
	}

(new MyThread()).start();

Answer 2: Implement Runnable:
	class MyRunnable implements Runnable {
	public void run() { 
		// ... 
	}
	}

(new Thread(new MyRunnable())).start();

The second method should be preferred in almost all situations. Only subclass Thread if you intend to change its behaviour, implement Runnable to provide a run() method for the standard thread class.

Why? Both approaches work equally well.

Runnable is more reusable than Thread. A Runnable interface just tells that a piece of code can be 'run'. So it may be reused, for example, as the result of an action performed on a menu item, a combo box and in a separate timer-invoked thread. If you extend Thread, it will be useful only in that context -- VhIndukumar

I don't understand. Why is Runnable more reusable than Thread? Specializations of Thread can be reused in those contexts as easily as implementations of Runnable.

Runnable is an interface. Thread is a class. If you want a runnable ComboBox, you can get just that. But you cannot inherit from Thread and ComboBox.'

But you don't need a runnable ComboBox for any of the situations listed above. In fact, I've been programming in Java for 7 years and I've never needed a runnable ComboBox.

I've only heard one convincing reason to use Runnable -- for integration with a threading library like DougLea's util.concurrent. See http://gee.cs.oswego.edu/dl/classes/EDU/oswego/cs/dl/util/concurrent/intro.html for more information.
It is also recommendable to name your threads. E.g.:
	new Thread(someRunnable, "someRunnable").start();

It's worth pointing out that you can easily make threads to run arbitrary methods using inner classes.

	final SomeClass target=someObject;
	(new Thread() { public void run() { target.someMethod(); }).start();

This probably qualifies as reaching too deep into the bag of tricks. Bah. Perhaps create the thread in a separate statement from starting it, with an eye to the LawOfDemeter, but otherwise the intent is clear & straightforward. It's as close as you can get to createThread(functionPtr) as you're going to get in Java.
see HowTo