elhacker.net cabecera Bienvenido(a), Visitante. Por favor Ingresar o Registrarse
¿Perdiste tu email de activación?.

 

 


Tema destacado: Únete al Grupo Steam elhacker.NET


+  Foro de elhacker.net
|-+  Programación
| |-+  Programación General
| | |-+  Java
| | | |-+  Multihilos
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: [1] Ir Abajo Respuesta Imprimir
Autor Tema: Multihilos  (Leído 2,027 veces)
m@o_614


Desconectado Desconectado

Mensajes: 389


Ver Perfil
Multihilos
« en: 21 Septiembre 2015, 05:38 am »

Saludos, estoy haciendo un programa el cuál tiene que correr e imprimir X número de procesos en una JTextArea, para esto utilizo un hilo de la siguiente manera

Código
  1. class Hilo implements Runnable,KeyListener
  2. {
  3. Nodo enEjecucion;
  4. private Hilo2 hilo2;
  5. private static final int CANICAS_X_LOTE = 5;
  6. private boolean puedeImprimir = true,sinPulsar = true;
  7. private static LinkedList<Nodo> listos = new LinkedList<Nodo>();
  8. private JTextArea areaTexto1,areaTexto2,areaTexto3,areaBloqueados;
  9. private JTextField campoTeclaPulsada;
  10.    private int numeroCanicas,id = 1;
  11.  
  12.    public Hilo(int numero,JTextArea a1,JTextArea a2,JTextArea a3,JTextField campoTeclax,JTextArea bloqueados)
  13. {
  14. numeroCanicas = numero;
  15. areaTexto1 = a1;
  16. areaTexto2 = a2;
  17. areaTexto3 = a3;
  18. areaBloqueados = bloqueados;
  19. campoTeclaPulsada = campoTeclax;
  20. campoTeclaPulsada.addKeyListener(this);
  21. }
  22.  
  23.    public void run()
  24.    {
  25. for(int i = 1;i <= CANICAS_X_LOTE;i++)
  26.       agregarCanica();
  27. ejecutar();
  28.    }
  29.  
  30.    public void agregarCanica()
  31.    {
  32.     Random t = new Random();
  33.     Nodo nodo = new Nodo();
  34. nodo.ID = id;
  35. nodo.Tiempo = (int)(t.nextDouble() * 5 + 1);
  36. nodo.tipoCanica = elegirTipoCanica();
  37. listos.add(nodo);
  38. id++;
  39.    }
  40.  
  41.    public void ejecutar()
  42. {
  43. long tiempo;
  44. while(!listos.isEmpty() && puedeImprimir)
  45. {
  46. imprimirListos();
  47. try
  48. {
  49. enEjecucion = listos.removeFirst();
  50. areaTexto1.setText(null);
  51. if(id <= numeroCanicas)
  52.   agregarCanica();
  53. imprimirListos();
  54. areaTexto2.append("ID: "+enEjecucion.ID+"\nTiempo: "+enEjecucion.Tiempo+"\nTipo: "+enEjecucion.tipoCanica+"\n\n");
  55. tiempo = (enEjecucion.Tiempo)*1000;
  56. Thread.sleep(tiempo);
  57. areaTexto2.setText(null);
  58.  
  59. if(sinPulsar)
  60.       areaTexto3.append("ID: "+enEjecucion.ID+"     Tiempo: "+enEjecucion.Tiempo+"    Tipo: "+enEjecucion.tipoCanica+"\n");
  61. }
  62. e.printStackTrace();
  63. }
  64. }
  65. areaTexto2.setText(null);
  66. }
  67.  
  68.    public void imprimirListos()
  69. {
  70. Iterator<Nodo> it = listos.iterator();
  71. while(it.hasNext())
  72. {
  73. Nodo canica = (Nodo)it.next();
  74.    areaTexto1.append("Canica: "+canica.ID+"\tTiempo: "+canica.Tiempo+"\n");
  75. }
  76. areaTexto1.append("\n");
  77. }
  78.  
  79.    public static String elegirTipoCanica()
  80. {
  81. int indice;
  82. Random n = new Random();
  83. String tipo[] = {"Ojo de gato","Transparente","Bolones","Trebol","Agatas","Vergel","Onix","Piojines","Tirito","Japonesa"};
  84. indice = (int)(n.nextDouble() * 9 + 0);
  85. return tipo[indice];
  86. }
  87.  
  88. public void ocurrioBotonazo(ActionEvent e)
  89. {
  90. hilo2 = new Hilo2(areaBloqueados,enEjecucion);
  91. hilo2.start();
  92. }
  93. }

El problema que tengo es que tengo que utilizar un evento de boton, una vez que oprima el boton se tiene que bloquear el proceso que se esta imprimiendo, yo por eso cree otro hilo al que le paso el JTextArea donde se va a imprimir el proceso bloqueado y el proceso.

Código
  1. public class Hilo2 extends Thread{
  2. private long espera;
  3. private Nodo bloqueado;
  4. private JTextArea areaBloqueados;
  5. private Random t = new Random();
  6.  
  7. public Hilo2(JTextArea area,Nodo enEjecucion)
  8. {
  9. bloqueado = enEjecucion;
  10. }
  11.  
  12. public void run()
  13. {
  14. try
  15. {
  16. bloqueado.Tiempo = (int)(t.nextDouble()* 7 + 5);
  17. espera = (bloqueado.Tiempo)*1000;
  18.    areaBloqueados.append("ID: "+bloqueado.ID+"     Espera: "+bloqueado.Tiempo+"    Tipo: "+bloqueado.tipoCanica+"\n");
  19.    Thread.sleep(espera);  
  20. }
  21. }
  22. }
  23.  

pero me lanza un error una vez que el hilo2 se ejecuta y no se cual es el problema

de antemano gracias


En línea

MGGM

Desconectado Desconectado

Mensajes: 5


Ver Perfil
Re: Multihilos
« Respuesta #1 en: 28 Septiembre 2015, 17:54 pm »

Hola, coloca el stacktrace para poder observar con claridad la causa del error ya que pueden ser varias causas, por ejemplo, la más común en concurrencia es que se comparten objetos entre varios threads sin estar sincronizados. Aparte de esto tengo algunas preguntas:

¿a qué te refieres con bloqueado, quieres decir cancelado o dormido?
¿Qué significa areaTexto1, areaTexto2?

Es complicado leer tu código porque no utilizas nombres apropiados y no se puede comprender qué funciones cumplen las variables/funciones.

Si puedieses explicar cómo debe de funcionar tu código y qué funciones debe realizar, sería bueno.


En línea

Páginas: [1] Ir Arriba Respuesta Imprimir 

Ir a:  

Mensajes similares
Asunto Iniciado por Respuestas Vistas Último mensaje
Emular MultiHilos (multithread) Sin Fork (FAKE FORK) « 1 2 »
PHP
OzX 14 9,488 Último mensaje 27 Marzo 2009, 00:24 am
por OzX
Tutorial para multihilos en C (windows.h)
Programación C/C++
galapok11 1 2,884 Último mensaje 26 Agosto 2016, 15:53 pm
por ivancea96
thread multihilos
.NET (C#, VB.NET, ASP)
Juan Sanchez 3 4,220 Último mensaje 7 Noviembre 2017, 20:58 pm
por Juan Sanchez
WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines