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
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.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; } } }
purtroppo non riesco a sincronizzarli, non rispettano i tempi e ricevo i seguenti errori
credo di aver implementato male la sincronizzazione, tutto questo è all'interno di una stessa classe. Qualcuno può aiutarmi?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)

Rispondi quotando