Pregunta Java: llamar a run() en vez de start()

Piensa la respuesta antes de abrirla. Todas las opciones parecen razonables, y casi siempre hay un detalle que lo cambia todo.

Pregunta Java · Threads

¿Cuál es el resultado de compilar y ejecutar la clase Test02?

public class Test02 {
    public static void main(String argv[]) {
        Test1 pm1 = new Test1("Uno");
        pm1.run();
        Test1 pm2 = new Test1("Dos");
        pm2.run();
    }
}

class Test1 extends Thread {
    private String nombre = "";
    Test1(String s) {
        nombre = s;
    }
    public void run() {
        for (int i = 0; i < 2; i++) {
            try {
                sleep(1000);
            } catch (InterruptedException e) {
            }
            yield();
            System.out.println(nombre);
        }
    }
}
  1. Uno Dos
  2. Uno Dos Uno Dos
  3. Uno Uno Dos Dos
  4. Error de ejecución
Ver la respuesta

Respuesta: c.

java Test02  —  con Thread.yield()Uno
Uno
Dos
Dos

El código llama a run() directamente, no a start(). Así no se crea ningún hilo: run() es un método normal que se ejecuta en el hilo principal, de principio a fin, antes de pasar a la línea siguiente. Primero Uno dos veces, luego Dos dos veces, y tarda unos cuatro segundos por los cuatro sleep(1000). Con start(), los dos hilos irían a la vez y lo normal sería ver los nombres intercalados.

En Java actual este código ya no compila tal cual. Desde Java 14, yield es una palabra con significado propio en las expresiones switch, y una llamada sin calificar se rechaza:
javac Test02.java  —  Java 25Test02.java:21: error: invalid use of a restricted identifier 'yield'
            yield();
            ^
  (to invoke a method called yield, qualify the yield with a receiver or type name)
1 error

Basta con escribir Thread.yield();. Con ese cambio se obtuvo la salida de arriba. En 2014, con Java 7 u 8, el código original compilaba.

Pregunta publicada en 2014 y revisada en octubre de 2026. La respuesta se comprobó compilando y ejecutando el código con Java 25 LTS en un contenedor limpio; las salidas están copiadas de esa ejecución.