Problemas con Thread

Hello, por favor alguien ayúdeme con este problemita:
Estoy haciendo una pequeña aplicación, "juego" puzzle,

*Consiste en un cuadro con números en botones del 1 al 23.
* hice un método de desorganizar los botones para que el usuario o jugador comience a ordenar los números (que de so se trata el juego).

* Hasta ahí todo bien, ahora se me ocurre agregar un cronometro, la única vía que conozco es con los Threads , para llevar el tiempo que el jugador tardara en ordenar el rompecabeza.

Cuando corro el thread con un while infinito para calcular el tiempo transcurrido de la partida hasta que sea organizado con la intervención del usuario viene problema:

Los botones retornan solitos a la poción original con cada segundo o vuelta del while (true)

ufff no comprendo porque!! Y es el motivo de la misiva.

BOTON NUEVA PARTIDA

Chrom hilo1=new Chrom();
hilo1.start();

MasterClass Positions = new MasterClass();
Positions.Randoming();

------------------

public class Chrom extends Thread {

public Thread corre;
int minutos = 0, segundos = 0, horas = 0;

public void run() {

while (true) {
try {
corre.sleep(1000);
if (segundos == 59) {
segundos = 0;
minutos++;
}
if (minutos == 59) {
minutos = 0;
horas++;
}
segundos++;
NewJFrame.jLtime.setText(horas + ":" + minutos + ":" + segundos);
} catch (InterruptedException ex) {
Logger.getLogger(Chrom.class.getName()).log(Level.SEVERE, null, ex);
}
}

}
}

-----------para que vean algo de codigo aqui algo----------------------
/*
* To change this template, choose Tools | Templates
* and open the template in the editor.
*/
package puzzlert;

import javax.swing.JButton;
import javax.swing.JOptionPane;

/**
*
* @author rtaveras
*/
public class MasterClass {
/*el boton sin numero es el home con nombre jbbingo*/

int xclickedButton, yclickedButton, xhome, yhome;
int ValorPosicion = 0;
public void PosicionIndividual(JButton boton, JButton home) {
//mueve el boton clickliado
xclickedButton = boton.getLocation().x;
yclickedButton = boton.getLocation().y;
xhome = home.getLocation().x;
yhome = home.getLocation().y;
//calculos para posicionar los botones dependiendo si es valida la posicion.
int r1 = xclickedButton - home.getLocation().x;
int r2 = yclickedButton - home.getLocation().y;

int r3 = r1 + r2;

if (Math.abs(r3) == 40 || Math.abs(r3) == 75) {
//intercharnge position
//solo si es pertinente segun la distancia entre ellos
home.setLocation(xclickedButton, yclickedButton);
boton.setLocation(xhome, yhome);
} else {
JOptionPane.showMessageDialog(null, "Invalid move. Movimiento no Permitido" /*+ r1 + "--" + r2*/);
}
}

public void Randoming() {
for (int i = 1; i <= 23; i++) {
/*genero un boton a mover al azar entre los 23 y el vacio.
val es el resultado de el sorteo, si es cero "0" entonces envio al metodo interchange el nombre del boton
a mover y el jtbhome que seria el hueco
*/

int val = (int) Math.round(Math.random() * 23 + 0);

switch (val) {
case 0:
Interchange(NewJFrame.jButton1, NewJFrame.JtBhome);
break;
case 1:
Interchange(NewJFrame.jButton2, NewJFrame.JtBhome);
break;
case 2:
Interchange(NewJFrame.jButton3, NewJFrame.JtBhome);
break;
case 3:
Interchange(NewJFrame.jButton4, NewJFrame.JtBhome);
break;
case 4:
Interchange(NewJFrame.jButton5, NewJFrame.JtBhome);
break;
case 5:
Interchange(NewJFrame.jButton6, NewJFrame.JtBhome);
break;
case 6:
Interchange(NewJFrame.jButton7, NewJFrame.JtBhome);
break;
case 7:
Interchange(NewJFrame.jButton8, NewJFrame.JtBhome);
break;
case 8:
Interchange(NewJFrame.jButton9, NewJFrame.JtBhome);
break;
case 9:
Interchange(NewJFrame.jButton10, NewJFrame.JtBhome);
break;
case 10:
Interchange(NewJFrame.jButton11, NewJFrame.JtBhome);
break;
case 11:
Interchange(NewJFrame.jButton12, NewJFrame.JtBhome);
break;
case 12:
Interchange(NewJFrame.jButton13, NewJFrame.JtBhome);
break;
case 13:
Interchange(NewJFrame.jButton14, NewJFrame.JtBhome);
break;
case 14:
Interchange(NewJFrame.jButton15, NewJFrame.JtBhome);
break;
case 15:
Interchange(NewJFrame.jButton16, NewJFrame.JtBhome);
break;
case 16:
Interchange(NewJFrame.jButton17, NewJFrame.JtBhome);
break;
case 17:
Interchange(NewJFrame.jButton18, NewJFrame.JtBhome);
break;
case 18:
Interchange(NewJFrame.jButton19, NewJFrame.JtBhome);
break;
case 19:
Interchange(NewJFrame.jButton20, NewJFrame.JtBhome);
break;
case 20:
Interchange(NewJFrame.jButton21, NewJFrame.JtBhome);
break;
case 21:
Interchange(NewJFrame.jButton22, NewJFrame.JtBhome);
break;
case 23:
Interchange(NewJFrame.jButton24, NewJFrame.JtBhome);
break;
}

}
}

public void Interchange(JButton boton, JButton home) {

xclickedButton = boton.getLocation().x;
yclickedButton = boton.getLocation().y;
xhome = home.getLocation().x;
yhome = home.getLocation().y;
home.setLocation(xclickedButton, yclickedButton);
boton.setLocation(xhome, yhome);
}

uso Netbeans.

gracias.

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

segundo thread?

Tu clase Chrom tiene una variable publica Thread corre, eso que?

Problemas con Thread

por desconocimiento la he dejado ahi , antes la usaba para instanciar la clase o mas bien heredar asi , chrom.corre.start
luego vi que no es necesaria o que daba igual que solo instanciara la clase tal como lo estoy haciendo.
Chrom hilo1=new Chrom();
hilo1.start(); ya que por defecto se ejecuta lo que hay en el metodo run obligatorio...

me late que hay un lio con los metodos Run , tanto de mi clase como la del formulario principal pues en la sprimeras lineas
me suguiere el editor que haga una sobre carga

public class Chrom extends Thread {

public Thread corre;
int minutos = 0, segundos = 0, horas = 0;

// JUSTO AQUI
public void run() {

while (true) {

----------------------

Imagen de JaimeItlzc

Me paso Igual

Yo tenia un problema parecido al tuyo @rtaverar al parar el thread usando el metodo stop() , el cual me comento @ezamudio era obsoleto implementado ahora el metodo interrupt() igual manejaba un cronometro pero la diferencia es que el mio era un for infinito mi problema era que creaba un thread y al correr el thread.star(), se terminaba mi thread ya que no contenia un tarjet mi thread(el metodo run hiba por separado de mi thread eran procesos diferentes).

saludos.

Imagen de ezamudio

Threads

Es mejor crear Runnables que extender Thread, y luego instanciar Thread con esos Runnables como targets.

problemas thread

Algo tengo que estar haciendo mal, por las dos vias los botones vuelven a la posición original luego de ejecutar el thread.
Aunque el reloj sigue corriendo y el programa sigue su curso.. solo que cuando intercambio las posiciones de los botones cuando hago click , se devuelve como por acto de macia con el segundo que transcurre.

Imagen de ezamudio

ActionListener

Habría que ver el código de los ActionListeners de los botones (el método actionPerformed() que se invoca al oprimir cada botón).

Imagen de JaimeItlzc

Blog @ezamudio

Entra a checar el blog de @ezamudio ese post que hizo me ayudo bastante sobre los thread comprendi mas a fondo sobre los Runnables y sobre instanciar Theread a esos Runnables.

Gracias por el aporte Ezamudio.

por favor dame el enlace,

por favor dame el enlace, gracias.

Imagen de JaimeItlzc

Facebook javaMéxico

En el Facebook javaMéxico la sesion 9 habla soble threads con unos ejemplos muy aplicables podrias checarlos.

Saludos.