Los hilos de ejecución en Java permiten que una misma aplicación pueda ejecutar simultáneamente varias tareas. Para ello se dispone de la clase Thread.

Para crear un nuevo hilo de ejecución se debe crear una nueva clase que implemente la clase Runnable:

class NombreDelHilo implements Runnable

En el método constructor de la clase se creará un nuevo objeto de la clase Thread y se llamará al método start() para que se inicie su ejecución.:

    public NombreDelHilo()
    {
         Thread hilo=new Thread(this);
         hilo.start();
    }

El código del proceso que se desea ejecutar se debe incluirse en un método run(). Las líneas de código que se incluyan en este método, se ejecutarán al invocar al método start() del hilo de ejecución, por tanto no se debe hacer una llamada directa a este método run().

    public void run ()
    {
        //Escribir aquí las líneas de código del hilo del ejecución
    }

Ahora es el momento de crear una instancia de esta clase desde la clase principal y ejecutar el hilo:

public class Main {

public static void main(String[] args) {
NombreDelHilo nombreHilo1 = new NombreDelHilo();
}

}

Para comprobar la diferencia de ejecutar un proceso como hijo de ejecución comparado con la ejecución normal, se puede definir una clase Contador que realice un cuenta del 1 al 5 mostrando los números en la salida estándar. Desde la clase principal se hace una llamada al método run() de la clase Contador y después se muestra el mensaje "Fin del programa principal":

{code class="highlight:5"}

public class Main {

public static void main(String[] args) {
Contador contador1 = new Contador();
contador1.run();
System.out.println("Fin del principal");
}

}

class Contador implements Runnable{

public void run ()
{
int cuenta = 1;
while(cuenta <= 5) {
System.out.println("Contador va por: " + cuenta);
cuenta++;
}
}
}

{/code}

El resultado de la ejecución será el siguiente:

Contador va por: 1
Contador va por: 2
Contador va por: 3
Contador va por: 4
Contador va por: 5
Fin del programa principal

Es decir, el programa principal queda parado hasta que termina la ejecución del método run() de la clase Contador. Cuando ha terminado el contador es cuando se muestra el final del programa principal.

En cambio, si el método run() anterior se ejecuta como un hilo de ejecución llamando al método start() el resultado cambia:

{code class="highlight:[14,15]"}

public class Main {

public static void main(String[] args) {
Contador contador1 = new Contador();
System.out.println("Fin del programa principal");
}

}

class Contador implements Runnable{

public Contador()
{
Thread hilo=new Thread(this);
hilo.start();
}

public void run ()
{
int cuenta = 1;
while(cuenta <= 5) {
System.out.println("Contador va por: " + cuenta);
cuenta++;
}
}
}

{/code}

Ahora el resultado obtenido es el siguiente:

Fin del programa principal
Contador va por: 1
Contador va por: 2
Contador va por: 3
Contador va por: 4
Contador va por: 5

Se puede observar que el programa principal ha terminado y mientras tanto ha empezado el proceso del Contador.

public class Main {

public static void main(String[] args) {
Contador contador1 = new Contador();
contador1.hilo.start();
//        contador1.run();
System.out.println("Fin del principal");
}

}