Autor
|
Tema: Dudas sobre hilos (Leído 4,074 veces)
|
m@o_614
Desconectado
Mensajes: 389
|
Saludos tengo el siguiente código que trata sobre construir una aplicación basada en hilos que contemple la ejecución de un hilo evento y su interacción con un hilo Thread. Para realizar la aplicación tengo que cumplir con los siguientes requerimientos: 1. Ambos hilos impriman un contador en áreas de texto particulares. 2. Un hilo imprima cada segundo y el otro cada 2 segundos. 3. Incluir un botón para asociarlo en tiempo compilación a uno cualquiera de los hilos. 4. Al presionar el botón, que el hilo correspondiente suspenda su ejecución. 5. El hilo reanude su ejecución tras otro botonazo con el mismo botón que el punto anterior. 6. La suspensión del hilo conlleve a suspender los efectos del hilo sobre su correspondiente área de texto. 7. El evento del botonazo, provoque el paso de solo un mensaje al objeto hilo, indicándole solo que ha ocurrido un botonazo, por lo que el método a invocar no deberá recibir parámetro. y el codigo es el siguiente: import java.awt.*; import java.awt.event.*; import javax.swing.*; private int cuenta; private long segundos; private boolean imprime; Hilo(int seg,int contador){ cuenta = contador; segundos = seg; imprime = true; } public void run() { while(imprime) { System. out. println(""+cuenta ); cuenta++; } } } private Hilo hilo1,hilo2; Interfaz() { ventana.add("South",areaTexto1); ventana.add("North",areaTexto2); hilo1 = new Hilo(1000,0); hilo2 = new Hilo(2000,0); this.add(ventana); boton.addActionListener(this); } { hilo1.start(); //hilo1.sleep(seg); } } public class MensajesHilos { public static void main (String[] args ) { Interfaz interfaz = new Interfaz(); interfaz.setTitle("Manejo de Hilos"); interfaz.setBounds(200, 200, 400, 400); interfaz.setVisible(true); } }
El problema que tengo es que en el método run() que es el que ejecuta el hilo, no se como hacerle para asignarle un area de texto para que imprima en ella, porque el area de texto la tengo declarada en la clase de interfaz, y en el actionPerformed de la clase interfaz, que es la que me dice que acción ejecutar con el evento botonazo, pero no tengo muy claro para hacer que en el primer botonazo pare el hilo, que al segundo reanude la ejecución y asi sucesivamente de antemano gracias
|
|
|
En línea
|
|
|
|
3n31ch
Desconectado
Mensajes: 445
Grandes conocimientos engendran grandes dudas
|
Con hilo evento te refieres a un event dispatch thread? si es así porque creas dos hilos? Por cierto nunca añadiste el botón. Te intentaría ayudar, pero si te soy sincero no te entiendo nada, le diré a Gus a ver si el entiende que es lo que quieres Edito: Ok, el tampoco te entendió. Te recomiendo que modifiques tu mensaje y solo pongas tu duda o dudas (enumeradas) de esta manera te podremos responder, ya que con el mensaje actual no me queda claro que es lo que quieres xD!
|
|
« Última modificación: 12 Febrero 2015, 06:01 am por Nac-ho »
|
En línea
|
|
|
|
Usuario Invitado
Desconectado
Mensajes: 625
|
Para serte sincero no te entendí un carajo xD. Releyendo el enunciado entendí algo. Usa el patrón MVC para poder interactuar entre modelo/vista/controlador. Vista:public class GUI extends JFrame { private Controller ctrl; public GUI() { this.ctrl = this; buildGUI(); } private void buildGUI() { btnOne.addActionListener(ctrl); btnTwo.addActionListener(ctrl); ... } }
Controlador: private GUI gui; private int clicCount = 0; public Controller(GUI gui) { this.gui = gui; } public Controller @Override public void actionPerformed (ActionEvent evt ) { if(evt.getActionCommand().equals("btnOne")) { clicCount++; if(clicCount == 2) { timer.cancel(); return; } timer.schedule(new ThreadBuilder("btnOne", "Mensaje 1", gui), 0, 1000); } else if (evt.getActionCommand().equals("btnTwo")) { clicCount++; if(clicCount == 2) { timer.cancel(); return; } timer.schedule(new ThreadBuilder("btnTwo", "Mensaje 2", gui), 0, 2000); } } }
Una tarea controlada por tiempo: (Modelo)public class ThreadBuilder implements TimerTask { private GUI gui; public ThreadBuilder (String actionCommand, String message GUI gui ) { this.actionCommand = actionCommand; this.message = message; this.gui = gui; } @Override public void run() { if(actionCommand.equals("btnOne")) { gui.getTextAreaOne().setText(message); } else { gui.getTextAreaTwo().setText(message); } } }
El método schedule recibe un objeto tipo TimerTask, el timeout que es el tiempo de espera el cual una vez expirado se ejecutará por primera vez el thread y el intérvalo de ejecución en milisegundos. Solo eso te pude entender. Espero te sirva de algo.
|
|
|
En línea
|
"La vida es muy peligrosa. No por las personas que hacen el mal, si no por las que se sientan a ver lo que pasa." Albert Einstein
|
|
|
m@o_614
Desconectado
Mensajes: 389
|
muchas gracias por sus respuestas, creo que no me explique muy bien porque de hecho yo tampoco entendía completamente las especificaciones para el código. Espero poderme explicar mejor esta vez. Yo tengo una interfaz gráfica en la que tengo 2 areas de texto y un boton. En cada area de texto me va a imprimir el contador de un hilo(como son dos areas de texto son 2 hilos). El contador de ambos inicia desde 0. Uno de los hilos va impriendo el contador cada segundo y el otro cada 2 segundos. Después voy a elegir uno de los hilos(el que sea), y ese hilo lo voy a asociar con el boton de la interfaz. Cuando yo oprima el boton va a ocurrir un evento boton, en el cual se tiene que parar la ejecución de ese hilo solamente, (el otro seguira imprimiendo como si nada), esto con el uso de una bandera. Y es ahi donde esta el problema que tengo porque para un hilo la bandera va a tener valor true siempre, pero en el otro hilo cuando tenga un botonazo la bandera va a ser false, indicando que pare import java.awt.*; import java.awt.event.*; import javax.swing.*; private int cuenta = 0; private long pausa; private boolean puedeImprimir = true; Hilo (long milisegundos, JTextArea cuadroTexto ){ pausa = milisegundos; areaTexto = cuadroTexto; } public void run() { while(puedeImprimir) { try { imprimirContador(); sleep(pausa); cuenta++; } { e.printStackTrace(); } } } public void imprimirContador() { areaTexto.setText(tiempo); } } private Hilo hilo,hiloEvento; Interfaz() { hilo = new Hilo(2000,areaTexto); hiloEvento = new Hilo(1000,areaTexto2); hilo.start(); hiloEvento.start(); boton.addActionListener(this); } { ???????????????????? } } public class MensajesHilos { public static void main (String[] args ){ Interfaz interfaz = new Interfaz(); interfaz.setTitle("Hilos de Control"); interfaz.setBounds(200, 200, 300, 240); interfaz.setVisible(true); } }
lo que quiero es tener una variable booleana en la que su valor en un hilo sea siempre true,y en el otro se haga false cuando haya un botonazo
|
|
|
En línea
|
|
|
|
3n31ch
Desconectado
Mensajes: 445
Grandes conocimientos engendran grandes dudas
|
La vez pasada creí que querías parar el event dispatch thread o algo asi No entiendo que es lo que te complica. Por que no haces en la clase Hilo un: public void setPuedeImprimir(boolean puedeImprimir){ this.puedeImprimir = puedeImprimir; }
Después de todo solo quieres detenerlo no? (no quiere reanimarlo) y luego en la interfaz haces: hiloEvento.setPuedeImprimir(false); }
o no funciona?
|
|
|
En línea
|
|
|
|
m@o_614
Desconectado
Mensajes: 389
|
muchas gracias Nac-ho, funciona perfectamente. No se por qué se me complicó algo tan simple. Una última duda si después de que de el primer botonazo(con la respectiva suspensión) yo quiero reanudar la impresión con otro botonazo, ¿cuál sería la mejor opción???
|
|
|
En línea
|
|
|
|
3n31ch
Desconectado
Mensajes: 445
Grandes conocimientos engendran grandes dudas
|
Si no te quieres complicar, al segundo botonazo reasigna asl hiloEvento un nuevo Thread con las mismas características y dale start otra vez (código basura, pero funcionara) En el thread agrega un get: public boolean getPuedeImprimir(){ return puedeImprimir; }
Y este seria tu action performed: if(hiloEvento.getPuedeImprimir()){ hiloEvento.setPuedeImprimir(false); } else { hiloEvento = new Hilo(1000,areaTexto2); hiloEvento.start(); } }
(esto se me ocurre para que no tengas que ocupar ningún conocimiento extra al que ya tienes).
Modifico. Me arrepentí por darte una respuesta tan fea te dejare una un poco mejor: puedes detener el hilo sin modificar tu boolean. haciendo lo siguiente: hiloEvento.wait(); // Para pausar hiloEvento.notify(); // Para reanudar
El tema es que hiloEvento.wait() puede generar un error, asi que tendras que contenerlo en un try catch, igual como lo haces con Thread.sleep(); Entonces te quedaría algo así: try { hilo.wait(); Logger.getLogger(Hilo.class.getName()).log(Level.SEVERE, null, ex); }
Eso para pausar, y para reanudar: hilo.notify();
^^
PD: te recomiendo estudiar mas tu lógica, retrocede un poco y haz ejercicios que no utilicen thread ni nada raro, solo clases y objetos, seguramente en el foro encontraras ejercicios. PD: Una manera bonita de hacer tu ejercicio es mediante synchronized por si acaso, pero eso que te puse debería ser suficiente (espero, no creo que de error). Suerte, y pásate por los post de buenas practicas y convenciones en java (eso de utilizar mas de una clase en un archivo...)
|
|
« Última modificación: 14 Febrero 2015, 03:07 am por Nac-ho »
|
En línea
|
|
|
|
m@o_614
Desconectado
Mensajes: 389
|
Saludos Nac-ho, tienes razon, necesito practicas más. Esta es mi primer practica en la que uso hilos y es por eso que me pierdo. Ya estuve leyendo sobre el metodo wait() y el notify() junto con synchronized. El wait creo que funciona correctamente, pero el notify que es el que me desbloquea el hilo no me reanuda la impresion, qué estoy haciendo mal? import java.awt.*; import java.awt.event.*; import javax.swing.*; import java.util.concurrent.atomic.AtomicBoolean; private int cuenta = 0; private long pausa; private boolean puedeImprimir = true; Hilo (long milisegundos, JTextArea cuadroTexto ){ pausa = milisegundos; areaTexto = cuadroTexto; } public void ocurrioBotonazo(){ if(puedeImprimir) { this.puedeImprimir = false; suspender(this); } else { this.puedeImprimir = true; reanudar(this); } } public synchronized void suspender(Hilo hilo) { if(hilo.puedeImprimir == false) { try { hilo.wait(); } } } } public synchronized void reanudar(Hilo hilo) { if(hilo.puedeImprimir) hilo.notify(); } public void run() { while(this.puedeImprimir) { try { this.imprimirContador(); this.cuenta++; } { e.printStackTrace(); } } } public void imprimirContador(){ areaTexto.setText(tiempo); } } private Hilo hilo,hiloEvento; Interfaz() { hilo = new Hilo(2000,areaTexto); hiloEvento = new Hilo(1000,areaTexto2); boton = new JButton("Pausar/Reanudar"); hilo.start(); hiloEvento.start(); boton.addActionListener(this); } { hiloEvento.ocurrioBotonazo(); } } public class MensajesHilos { public static void main (String[] args ){ Interfaz interfaz = new Interfaz(); interfaz.setTitle("Hilos de Control"); interfaz.setBounds(200, 200, 300, 240); interfaz.setVisible(true); } }
en la función de ocurrioBotonazo, en la parte donde dice que puedeImprimir es verdadero otra vez ( o sea que hubo un 2do botonazo) lo mando a reanudar() y el notify no me lo cacha
|
|
|
En línea
|
|
|
|
3n31ch
Desconectado
Mensajes: 445
Grandes conocimientos engendran grandes dudas
|
Ahora estoy algo apurado, asi que te pondré el código, analizalo: Este es tu thread: private int cuenta = 0; private long pausa; private boolean puedeImprimir = true; Hilo (long milisegundos, JTextArea cuadroTexto ){ pausa = milisegundos; areaTexto = cuadroTexto; } Hilo (long milisegundos, JTextArea cuadroTexto, int cuenta ){ pausa = milisegundos; areaTexto = cuadroTexto; this.cuenta = cuenta; } public void run() { while(puedeImprimir) { this.imprimirContador(); this.cuenta++; try { e.printStackTrace(); } } } public void imprimirContador(){ areaTexto.setText(cuenta+""); } public boolean isPuedeImprimir() { return puedeImprimir; } public void setPuedeImprimir(boolean puedeImprimir) { this.puedeImprimir = puedeImprimir; } }
Este es tu actionPerformed: if(hiloEvento.isPuedeImprimir()){ hiloEvento.setPuedeImprimir(false); } else { hiloEvento = new Hilo (1000,areaTexto2, Integer. parseInt(areaTexto2. getText())); hiloEvento.start(); } }
// El código no es robusto pero funciona. Y ya en serio, pásate por los post de buenas practicas. Y para de avanzar con Threads y esas cosas. Estudia lo basico. PD: Se me olvidaba. Agrega el JFrame.EXIT_ON_CLOSE en interfaz.
|
|
« Última modificación: 15 Febrero 2015, 03:01 am por Nac-ho »
|
En línea
|
|
|
|
|
Mensajes similares |
|
Asunto |
Iniciado por |
Respuestas |
Vistas |
Último mensaje |
|
|
Tengo varias dudas sobre DVD a formato FLV, y otras cosas sobre FLV
Multimedia
|
SaintGermain
|
0
|
2,627
|
30 Mayo 2005, 21:47 pm
por SaintGermain
|
|
|
[DUDAS] Todas las dudas sobre RadASD + MASM aqui
« 1 2 3 »
ASM
|
AleX Inc.
|
23
|
22,273
|
5 Julio 2010, 11:58 am
por Eternal Idol
|
|
|
Duda sobre hilos
Java
|
arts
|
4
|
2,307
|
7 Noviembre 2013, 00:07 am
por arts
|
|
|
Duda sobre threads (hilos) y semáforos (mutex)
Programación C/C++
|
IngenieroFrustrado
|
3
|
3,006
|
25 Enero 2014, 11:17 am
por amchacon
|
|
|
Sobre ejecucion de hilos en java
Java
|
droken26
|
0
|
2,154
|
12 Octubre 2017, 08:46 am
por droken26
|
|