Llevo varios dias pegado con esto, y no me funciona, creo que lo entiendo, pero no se que hago mal que no me funciona.
Mi intención es crear una comunicación entre tres hilos a través de Monitores. En total, dos monitores. Dos tuberias.
Tengo cuatro clases, hilo1,hilo2,hilo3 que heredan de Thread y una última Tuberia para establecer la comunicación.
Hilo1 tiene que leer un fichero de texto con números y mandarselo de 1 en 1 a Hilo2. Yo en vez de leer un fichero, lo que he hecho ha sido crear un bucle for, para no complicar la cosa mas aun con I/O.
Hilo2 tiene que recibir 5 números de Hilo1, sumarlos y el resultado mandarlo a Hilo3.
Hilo3 escribe el resultado que recibe de Hilo2 en un fichero de texto.
Como aun no he acabado entre Hilo1 y Hilo2, Hilo3 aun no esta hecho, pero os pongo el código. Aunque eso ahora mismo no me preocupa, además haciendo lo otro, saco el Hilo3.
El problema es que Hilo1 se pone a enviar de 1 en 1 hasta que completa el buffer (5), bien. Pero luego, cuando inicio el Hilo2 ya no consigo que me haga del todo bien lo que yo quiero. Además, solo me coge el último entero que del buffer, y ya vuelve a coger numeros del hilo1, y es cuando el programa se me queda parado (no colgado).
Hilo1public class Hilo1 extends Thread {
private Tuberia tuberia;
public Hilo1 ( Tuberia t ) {
tuberia = t;
}
public void run() {
for(int i = 0; i < 30; i++) {
tuberia.lanzar(i);
Formulario.jTextArea1.append("Nº "+i+" lanzado.\n");
try {
sleep(10);
}catch( InterruptedException e) {
}
}
}
}
Hilo2public class Hilo2 extends Thread {
private Tuberia tuberia;
private Tuberia tuberia2;
public Hilo2 (Tuberia t, Tuberia t2) {
tuberia = t;
tuberia2 = t2;
}
public void run() {
int c = tuberia.recoger();
int total = 0;
//for(int i = 0; i < 5; i++) {
Formulario.jTextArea2.append("Recogido el carácter "+c+"\n");
total+=c;
//}
Formulario.jTextArea2.append("Total"+total+"\n");
//tuberia2.lanzar(total);
//Formulario.jTextArea2.append("Lanzado "+c+"\n");
/* try {
sleep(50);
}catch( InterruptedException e) {
}*/
}
}
Hilo3public class Hilo3 extends Thread {
private Tuberia tuberia;
public Hilo3 (Tuberia t) {
tuberia = t;
}
public void run() {
int c = 0;
for(int i = 0; i < 10; i++) {
//c = tuberia.recoger();
Formulario.jTextArea3.append("Se supone que escribo "+c);
}
try {
sleep( (int)(Math.random()*2000));
}catch( InterruptedException e) {
}
}
}
Formulariopublic class Formulario extends javax.swing.JFrame {
Tuberia t;
Tuberia t2;
Thread h1;
Thread h2;
Thread h3;
/** Creates new form Formulario */
public Formulario() {
initComponents();
t = new Tuberia();
t2 = new Tuberia();
h1 = new Thread(new Hilo1(t));
h2 = new Thread(new Hilo2(t,t2));
//h3 = new Thread(new Hilo3(t2));
}
El resto son tres botones, donde hago en cada uno, su hN.start() correspondiente
Pienso que todo el problema esta en el método recoger() de la clase Tuberia, que no me vacia el buffer antes de empezar de nuevo a llenarlo.
Aquí esta el proyecto de Netbeans:
http://www.mediafire.com/download.php?nxuqow2ood5