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 ejecutar el siguiente código? ¿Y por qué?
public class Prueba extends Thread {
static String cadena = "hola";
public static void main(String argv[]) {
Prueba t = new Prueba();
t.inicia(cadena);
System.out.println(cadena);
}
public void inicia(String aux) {
cadena = aux + " mundo ";
start();
}
public void run() {
for (int i=0; i<4; i++) { cadena = cadena + " " + i; }
}
}- imprime
"hola mundo" - imprime
"hola mundo 0 1 2 3" - El resultado es impredecible.
Ver la respuesta
Respuesta: 3.
300 ejecuciones, contadas con uniq -c300 hola mundo
inicia() cambia la cadena a "hola mundo " y arranca un hilo nuevo; el hilo principal sigue y hace el println sin esperar a que el otro termine. Los dos hilos usan la misma variable estática sin ninguna sincronización, así que nada garantiza qué parte del bucle habrá hecho el segundo hilo cuando el primero imprima, ni siquiera que vea sus cambios.
¿Y la salida? En 300 ejecuciones salió siempre hola mundo : arrancar un hilo tarda bastante más que llegar al println. Pero eso es una casualidad del momento, no una garantía, y con otra máquina o con el sistema cargado podría salir otra cosa. Precisamente por eso la respuesta correcta es la 3: que un error de concurrencia no aparezca en las pruebas no significa que no exista. Para esperar al hilo se usa t.join() antes de imprimir.
Más preguntas de Java
- El orden de un HashSet
- wait() sin el monitor correcto
- start() con un argumento
- wait() fuera de synchronized
- Leer más allá del final de un archivo
- binarySearch con null
- Serializar una clase cuyo padre no es Serializable
- Clases internas anidadas
- Llamar a run() en vez de start()
- Un assert que nunca falla
- HashSet sin equals ni hashCode
- Campos transient al serializar
Pregunta publicada en 2013 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.
Opcion 2
Opcion 2
opcion 1
Opcion 2
Opción 1
opcion 2
3 es impredecible, porque cuando termina inicia, llama a start() y se va de lo que tenemos a la vista.
Opino lo mismo
igualmente
segun mi cerebro el resultado es "hola mundo 3" jajaja es q el primero no es puesto q si entra al ciclo for le va a poner 3 a la cadena … y el segundo tampoco es puesto q no andas mandando a imprimir asi.. jaja
chale no entiendo q puse.. bueno ensi lo que quise tratar de explicar es que imprime Hola mundo 3 pues el for no esta mandando a imprimir, se imprime hasta q termina el hilo!! su ejecucion
opcion 2
Cadena es static, se supone que no podria cambiar su valor?
es static pero no final, a leer dude
2
OPCION 1 JEJEJE
https://www.facebook.com/photo.php?fbid=10200896347351058&set=p.10200896347351058&type=1&theater
compilado!!!! Opcion 1
Si, tienes toda la razon y es por como los thread son dispuestos en la VM!!
aww yeah!
Sin duda la opción 1
imprime "hola mundo 4"
Opción uno…sin duda
A priori se puede analizar que es la 1.. Habría que compilar para certificar..
argv[]?
Opción 1, la función 'run()' nunca se manda a llamar.
Se ejecuta con el .start(). Aun así es la opción 1 porque se ejecuta el for y el systema.out en paralelo
Option 3…unpredictable….depends on JVM
Opción 1 !!!
3
Imprime hola mundo solamente nunca mandan llamar al void run
Opino lo mismo, en ningún momento se hace referencia de llamada a run 😀
el metodo start() llama a run()
Opcion 1, dado que lo que esta en run nunca se va a mostrar.
Como ya sabemos los thread, cuando se ejecutan simplemente son otro proceso en la VM, es decir son asincronos.
Opcion 1!
opcion 1 jejeje copie, pegue, y ejecute
Opcion 3, depende totalmente de la JVM, la razon por la cual parece ser la opcion 1 la correcta es porque casi siempre imprime "Hola mundo" y ya, pero si le dan un milisegundo de ventaja al run (cosa de la cual esta a cargo la JVM) este hilo gana al main con el System.out.println(cadena); e imprime "Hola mundo 0123"
Yo también opino que la Opción 3, ya que los Threads dependen del VM y no se puede saber qué Thread es el que gana cuando se ejecuta el System.out.println.
Eso depende de la computadora; o bien, del VM.
Opcion 3 :3 y no se peleen los hilos son imprescindibles si se fijan bien al terminar inicia se lanza el hilo (ojo esto no significa que se ejecutara inmediatamente) entonces se lanza el hilo y se muestra la cadena es posible que la cadena se muestre antes que se se ejecute run, al decir es posible no podemos estar 100% seguros </3
Opción 1 (Comprobado)
Opcion 1
2.-
opcion 2
Opcion 1
IMPRIME HOLA MUNDO, porque el proceso que ejecuta al metodo run tarda demasiado para cambiar del estado listo al de ejecucion, por lo tanto se ejecutara despues de la impresion de la cadena en pantalla.
Yo veo que todos responden… pero nunca el moderador pone la respuesta correcta…