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?