Multihilos

Iniciado por m@o_614, 21 Septiembre 2015, 05:38 AM

0 Miembros y 1 Visitante están viendo este tema.

m@o_614

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 (java) [Seleccionar]
class Hilo implements Runnable,KeyListener
{
Nodo enEjecucion;
private Hilo2 hilo2;
private static final int CANICAS_X_LOTE = 5;
private boolean puedeImprimir = true,sinPulsar = true;
private static LinkedList<Nodo> listos = new LinkedList<Nodo>();
private JTextArea areaTexto1,areaTexto2,areaTexto3,areaBloqueados;
private JTextField campoTeclaPulsada;
    private int numeroCanicas,id = 1;
   
    public Hilo(int numero,JTextArea a1,JTextArea a2,JTextArea a3,JTextField campoTeclax,JTextArea bloqueados)
{
numeroCanicas = numero;
areaTexto1 = a1;
areaTexto2 = a2;
areaTexto3 = a3;
areaBloqueados = bloqueados;
campoTeclaPulsada = campoTeclax;
campoTeclaPulsada.addKeyListener(this);
}
   
    public void run()
    {
for(int i = 1;i <= CANICAS_X_LOTE;i++)
       agregarCanica();
ejecutar();
    }
   
    public void agregarCanica()
    {
    Random t = new Random();
    Nodo nodo = new Nodo();
nodo.ID = id;
nodo.Tiempo = (int)(t.nextDouble() * 5 + 1);
nodo.tipoCanica = elegirTipoCanica();
listos.add(nodo);
id++;
    }
   
    public void ejecutar()
{
long tiempo;
while(!listos.isEmpty() && puedeImprimir)
{
imprimirListos();
try
{
enEjecucion = listos.removeFirst();
areaTexto1.setText(null);
if(id <= numeroCanicas)
   agregarCanica();
imprimirListos();
areaTexto2.append("ID: "+enEjecucion.ID+"\nTiempo: "+enEjecucion.Tiempo+"\nTipo: "+enEjecucion.tipoCanica+"\n\n");
tiempo = (enEjecucion.Tiempo)*1000;
Thread.sleep(tiempo);
areaTexto2.setText(null);

if(sinPulsar)
       areaTexto3.append("ID: "+enEjecucion.ID+"     Tiempo: "+enEjecucion.Tiempo+"    Tipo: "+enEjecucion.tipoCanica+"\n");
}
catch(InterruptedException e){
e.printStackTrace();
}
}
areaTexto2.setText(null);
}
   
    public void imprimirListos()
{
Iterator<Nodo> it = listos.iterator();
while(it.hasNext())
{
Nodo canica = (Nodo)it.next();
    areaTexto1.append("Canica: "+canica.ID+"\tTiempo: "+canica.Tiempo+"\n");
}
areaTexto1.append("\n");
}
   
    public static String elegirTipoCanica()
{
int indice;
Random n = new Random();
String tipo[] = {"Ojo de gato","Transparente","Bolones","Trebol","Agatas","Vergel","Onix","Piojines","Tirito","Japonesa"};
indice = (int)(n.nextDouble() * 9 + 0);
return tipo[indice];
}

public void ocurrioBotonazo(ActionEvent e)
{
hilo2 = new Hilo2(areaBloqueados,enEjecucion);
hilo2.start();
}
}


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 (java) [Seleccionar]
public class Hilo2 extends Thread{
private long espera;
private Nodo bloqueado;
private JTextArea areaBloqueados;
private Random t = new Random();

public Hilo2(JTextArea area,Nodo enEjecucion)
{
bloqueado = enEjecucion;
}

public void run()
{
try
{
bloqueado.Tiempo = (int)(t.nextDouble()* 7 + 5);
espera = (bloqueado.Tiempo)*1000;
    areaBloqueados.append("ID: "+bloqueado.ID+"     Espera: "+bloqueado.Tiempo+"    Tipo: "+bloqueado.tipoCanica+"\n");
    Thread.sleep(espera); 
}
catch(InterruptedException s){}
}
}


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

de antemano gracias

MGGM

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.