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
{
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 int numeroCanicas,id = 1;
{
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()
{
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;
areaTexto2.setText(null);
if(sinPulsar)
areaTexto3.append("ID: "+enEjecucion.ID+" Tiempo: "+enEjecucion.Tiempo+" Tipo: "+enEjecucion.tipoCanica+"\n");
}
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;
String tipo
[] = {"Ojo de gato",
"Transparente",
"Bolones",
"Trebol",
"Agatas",
"Vergel",
"Onix",
"Piojines",
"Tirito",
"Japonesa"}; indice = (int)(n.nextDouble() * 9 + 0);
return tipo[indice];
}
{
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.
public class Hilo2
extends Thread{ private long espera;
private Nodo bloqueado;
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");
}
}
}
pero me lanza un error una vez que el hilo2 se ejecuta y no se cual es el problema
de antemano gracias
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.