Hilos en Java, problemas con uso de Thread

Saludos compañeros:

Estoy tratando de implementar la carrera de la libre y el conejo usando hilos, pero cuando ejecuto el programa siempre da el mismo resultado y la liebre y el conejo se mueven al mismo tiempo. Según entendí al leer sobre el significado de los hilos esta ejecución debería ser siempre diferente dependiendo del tiempo que el asigne el sistema operativo a cada proceso en el hilo.Traté de usar el concepto de SwingWorker pero me dio lo mismo y no entiendo bien por qué,así que me quedé con esta versión del problema. Uso java 6, actualización 41 y construyo las ventanas con Netbeans.

Anexo el código de la Clase Liebre (porque el de la tortuga es idéntico, sólo cambio la imagen y se encuentra en una clase llamada Tortuga) y el código de la llamada de los hilos desde la ventana.

 

Opciones de visualización de comentarios

Seleccione la forma que prefiera para mostrar los comentarios y haga clic en «Guardar las opciones» para activar los cambios.
Imagen de ezamudio

liebre y conejo

La liebre y el conejo se mueven al mismo tiempo... será porque son prácticamente la misma cosa?

Liebre y conejo

Es que ejecuté el código sin la ventana y unas veces gana la liebre y otras veces gana la tortuga, es decir, no tiene el mismo comportamiento aún cuando tengan los mismo milisegundos asignados y cada vez que se ejecuta es distinto el movimiento. Cuando agregué la ventana en Netbeans dejó de funcionar y la verdad ni idea del por qué

Imagen de ezamudio

indeterminado

Pues así debe ser; si tienes dos hilos con la misma prioridad y que hacen exactamente lo mismo, y ambos los inicias al mismo tiempo, no tienes manera de saber cuál va a terminar primero.

Si quieres que la tortuga siempre termine después, tienes varias opciones:

- Puedes ponerle un retraso (si ambos hilos tienen retraso, debe ser mayor en el caso de la tortuga)
- Puedes ponerle una prioridad más baja al hilo, aunque eso realmente TAMPOCO garantiza que vaya a terminar después...
- Puedes darle a la tortuga una referencia a la liebre para que justo antes de llegar a la meta, le haga   y así espere a que la liebre llegue a la meta antes de que ella misma la cruce. Este sería el único método que garantiza que la tortuga llegue después, aunque se vea raro si la tortuga le gana a la liebre y luego se espera un paso antes de la meta a que la liebre gane...

liebre y conejo

Efectivamente, me fui por la opción que me indicaste de colocarle un mayor tiempo de retraso a la tortuga y siempre llega después del conejo; pero no logro descubrir la razón por la cual el código anterior que estaba corriendo directamente en la área de salida (output) de netbeans a pesar de tener tiempos iguales de retraso siempre generaba salidas distintas y ahora con la ventana hecha con el JFrame Form su comportamiento se vuelve predecible y siempre es la misma salida. No se si tenga que ver con el hecho de que la ventana como tal tiene su propio hilo, es decir, no estoy segura de que esta parte del código esté afectando a los hilos de la tortuga y el conejo.