Buscar
Social
Ofertas laborales ES

Foro sobre Java SE > Ayuda para usar Threads en Java

Buenas, tengo 16 años y hace unas semanas que estoy empezando a estudiar java desde 0 viendo tutoriales en YouTube(Los de Niktutos, específicamente), pero tengo problemas para comprender como usar correctamente los Threads en Java, me puse como práctica a mi mismo el realizar un programa que grafique un cuadrado en un panel, y que dependiendo de si presiono W, A, S o D se mueva el cuadrado en la dirección presionada (D a la derecha, S abajo...) Constantemente. Pero no entiendo como hacer eso usando threads(No tengo mucha capacidad analítica y lógica en esto, pero me esfuerzo), el código para ese programa lo hice en 3 clases distintas que colocaré a continuación.

Clase main:

public class Main{
public static void main(String[]args){
new Ventana();
}
}

Clase Ventana:

import java.awt.Color;
import java.awt.GridBagConstraints;
import java.awt.GridBagLayout;

import javax.swing.*;
public class Ventana extends JFrame{

Ventana(){
super("Snake");
this.setLayout(new GridBagLayout());
this.setSize(400,400);
this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
this.setResizable(true);
GridBagConstraints gbc = new GridBagConstraints();
gbc.gridx=0;
gbc.gridy=0;
gbc.gridwidth=1;
gbc.gridheight=1;
gbc.weightx=1.0;
gbc.weighty=1.0;
gbc.fill= GridBagConstraints.BOTH;


panel p = new panel();

p.setBackground(Color.black);
add(p,gbc);
this.setVisible(true);
}

}


Clase panel:

import javax.swing.*;
import java.awt.*;
import java.awt.event.*;
public class panel extends JPanel implements KeyListener,Runnable{
Point p;
Thread th;
public panel(){
this.addKeyListener(this);
th = new Thread(this);
p = new Point();
this.setFocusable(true);
th.start();
}public void paintComponent(Graphics g){
super.paintComponent(g);
g.setColor(Color.blue);
g.fillRect(p.x, p.y, 40, 40);

}

public void keyPressed(KeyEvent e) {
if(e.getKeyCode()==KeyEvent.VK_W){
p.y=p.y-50;
this.repaint();
}else if(e.getKeyCode()==KeyEvent.VK_D){
p.x=p.x+50;

this.repaint();
}else if(e.getKeyCode()==KeyEvent.VK_S){
p.y=p.y+50;
this.repaint();
}else if(e.getKeyCode()==KeyEvent.VK_A){
p.x=p.x-50;
this.repaint();
}
}

public void keyReleased(KeyEvent e) {

}


public void keyTyped(KeyEvent e) {


}

public void run() {
try {
Thread.sleep(100);

} catch (InterruptedException ie) {
}

}

}


El thread lo creé, pero no sé como usarlo o aplicarlo para que mueva el cuadro hacia X dirección, haga un repaint, espere tantos segundos y vuelva a hacerlo. De verdad, agradezco mucho la ayuda y disculpen que me cueste entender, a penas llevo unas pocas semanas estudiando esto.

mayo 30, 2016 | Registered Commenterjurgenmarcano

Cuando un programa se ejecuta lo hace de manera secuencial, una instrucción tras otra, dentro de un hilo (Thread). Pongamos por ejemplo el hilo main. Éste es el nombre que tiene el hilo con el que comienza a ejecutarse tu programa, que empieza con el método del mismo nombre. Este sería el ejemplo de cómo se ejecuta un programa (uso flechas para identar porque aquí no se cómo hacerle):

Inicio de programa
->método main
----->instruccion uno
----->instruccion dos
----->instruccion tres: (llámada a métodoX)
------------>instrucion uno de métodoX
------------>instrucion dos de métodoX
---->instruccion cuatro
---->instruccion cinco (Sentencia if, si no se cumple saltar hasta instrucción 6)
----------->instruccion uno de la sentencia
----->instruccion seis
Fin del programa

También están los bucles -como while- que regresarían la ejecución lineas arriba.
En fín, si no se inicia otro thread no-demonio, la ejecución del thread terminará junto con la del programa. Cuando creas una ventana, por ejemplo, el EventDispatchThread sigue ejecutándose aunque el hilo main haya terminado.

Uno de los usos que podrías darle a los threads -entre otros- es, por ejemplo, cuando creas una interfaz gráfica y al presionar un botón esté tiene que realizar una tarea muy lenta. En este caso, el usuario no podrá interactuar con la aplicación porque el hilo encargado de manejar los eventos estará ocupado en tú código. La solución sería ejecutar ésa tarea en un thread diferenre.

Bueno, y en lo que respecta a tu caso, aquí tienes un ejemplo que hice de un juego
muy sencillo que muestra como aplicar el uso de hilos en este caso. Se muetra el caso que dices de mover un recuadro con el teclado en el hilo de juego y no en el de despacho de eventos, además de unas pelotitas que rebotan por la pantalla (no se gana ni se pierde, sólo es de ejemplo).

No lo pongo aquí porque es difícil comprender código no identado (y por lo que me tardé haciéndolo).

https://www.dropbox.com/s/11ohvs1bb1jgxaf/Juego.java?dl=0

Por lo demás, yo también me inicié de forma autodidacta (hace como un par de años) en esto. Y lo de la capacidad analítica y sobre todo la de abtracción que es muy importante, ya las irás ganando si tienes unas buenas bases y practicas.

En fin, un gusto.

mayo 30, 2016 | Registered Commenterangelns

Usar la concurrencia en Java es uno de los asuntos más complejos que hay.
Siguen unos tutoriales que te serán imprescindibles para empezar "con buen pie".

https://docs.oracle.com/javase/tutorial/essential/concurrency/

http://tutorials.jenkov.com/java-concurrency/index.html

mayo 30, 2016 | Registered Commenterchoces

De verdad muchas gracias a los que respondieron, me ayudaron mucho! Entiendo un poco mejor ahora como funcionan los Threads, estaré posteando alguna otra duda que tenga, de verdad, gracias!

mayo 31, 2016 | Registered Commenterjurgenmarcano