Ciao a tutti, sto cercando di creare un thread che a sua volta continui a generare figli ( RichiestaId ), ogni figlio avrà un id che verra elaborato da elaborazioneMessaggio che dovrà inviare un array di 6 int
codice:
package connessione;
import java.io.IOException;
import java.net.Socket;
import java.net.UnknownHostException;
public class MyActivityRoot implements Runnable
{
private static Socket socket = new Socket();
private static int[] bloccoDomanda = new int[6];
private static int[] blocco = new int[6];
private static ConnessioneSocket a = new ConnessioneSocket();
private static RichiestaId r;
ElaborazioneMessaggio e = new ElaborazioneMessaggio();
@Override
public void run()
{
try {
socket = a.aprireConnessione();
} catch (UnknownHostException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
int id;
Thread t;
for( int i=0; i<6; i++)
{
id = e.getID;
r = new RichiestaId(socket, id, Costante.DUE*l.getMessagesDelay());
t = new Thread(r);
t.start();
System.out.println();
try {
bloccoDomanda = extract();
} catch (InterruptedException e2) {
// TODO Auto-generated catch block
e2.printStackTrace();
}
System.out.println();
bloccoDomanda = r.getBlocco();
System.out.println("Risposta del Root ");
for(int k = 0; k<6; k++) System.out.print(bloccoDomanda[k]+" ");
System.out.println();
if (e.ControlloRisposta(id, bloccoDomanda)) System.out.println("Va tutto bene");
else System.out.println("C'è qualcosa che non va");
try {
Thread.sleep(10000);
} catch (InterruptedException e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
}
}
}
protected int[] extract() throws InterruptedException
{
synchronized (blocco)
{
blocco.wait(5000);
return blocco;
}
}
public void insert (int[] risposta)
{
synchronized (blocco)
{
blocco = risposta;
blocco.notifyAll();
}
}
class RichiestaId implements Runnable
{
private int id;
private Socket socket = new Socket();
private Comunicazione comunicazione = new Comunicazione();
private int[] bloccoRisposta = new int[Costante.N_BLOCCHI];
private int timeSleep;
public RichiestaId(Socket socket, int id, int timeSleep)
{
this.id = id;
this.socket = socket;
this.timeSleep = timeSleep;
}
public void run()
{
try {
comunicazione.invioID(id, socket);
try {
bloccoRisposta = comunicazione.ricezioneBloccoDati(socket);
insert(bloccoRisposta);
System.out.print("Risposta\n");
System.out.println("2");
for(int i=0; i<6; i++)
{
System.out.print(bloccoRisposta[i]+" ");
}
notify();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
System.out.println();
try {
Thread.sleep(timeSleep);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
public int[] getBlocco()
{
return bloccoRisposta;
}
}
}
ora il mio scopo è che il padre crei un figlio, attende che gli arrivi la risposta e se nel caso non gli arrivasse niente lo killa o si killa da solo dopo 5 secondi, dopo aspetta 10 secondi e crea il secondo figlio.
purtroppo non riesco a sincronizzarli, non rispettano i tempi e ricevo i seguenti errori
codice:
Exception in thread "Thread-2" java.lang.IllegalMonitorStateException at java.lang.Object.notifyAll(Native Method)
at connessione.MyActivityRoot.insert(MyActivityRoot.java:105)
at connessione.MyActivityRoot$RichiestaId.run(MyActivityRoot.java:138)
at java.lang.Thread.run(Unknown Source)
credo di aver implementato male la sincronizzazione, tutto questo è all'interno di una stessa classe. Qualcuno può aiutarmi?