public class HelloRunnable implements Runnable {
public void run() {
System.out.println("Hello from a thread!");
}
public static void main(String args[]) {
(new Thread(new HelloRunnable())).start();
} }
According to Java Doc
The
Runnable
interface defines a single method,run
, meant to contain the code executed in the thread. The Runnable object is passed to the Thread constructor.
So, When we execute HelloRunnable, who calls the inside run method?
In the Thread
class, the start
method looks like this:
public synchronized void start() {
if (threadStatus != 0)
throw new IllegalThreadStateException();
group.add(this);
start0();
if (stopBeforeStart) {
stop0(throwableFromStop);
}
}
From this code, we can see that the start method is not calling the run()
method.
It is stated right in the documentation of
start
:So, it is the native code in
start0
of the JVM that takes care of callingrun
in the newly created thread. (This is not quite unexpected, as launching a thread is very OS-specific and cannot be implemented in pure Java.)Note:
start0
does not callrun
directly. Instead (on a high-level view, ignoring JVM-internal management), it instructs the operating system to create a new thread and let that thread executerun
.Just to clarify, here is a short description of the involved methods:
start
is the high-level function to start a newThread
.start0
is the native method which creates a new Thread from the operating system and is responsible to ensure thatrun
is called.run
is the method defined in yourRunnable
classes. This method is what will be executed in the new thread. AThread
object in Java itself has no idea about the user code it should execute. This is the responsibility of the associatedRunnable
object.Thus, when you call
Thread.start()
, therun
method of theRunnable
will automatically be called.Of course, you can always call the
run
method of aRunnable
explicitly:However, this will, of course, not be executed in a separate thread, but block the execution.