Ciao gente, sto cercando di fare un piccolo programmino che fa delle simulazioni.
Il mio scopo è quello di avere un thread che legge ogni singola riga da un file testo e più thread che processano da quella riga letta.
Una riga contiene semplicemente un numero (1 o 2 o 3).
Sono quasi riuscito a produrre un codice funzionante, perchè funziona correttamente fino a 3 thread che processano.
Alzando invece il numero comincio a perdere il controllo dei thread: l'ordine si sballa e saltano la lettura di alcune righe.

Il mio problema principale è quello di riuscire a fare in modo che i thread una volta finito di processare, vadano in wait, però l'ultimo
deve anche avvisare che tutti i thread hanno finito di processare. Così con la chiamata si fa partire la lettura di un'altra riga

Ho copiato i pezzi più importanti della classe che fa da monitor
codice:
// Scrivo il colore letto da file in un vettore e poi aspetto
public synchronized void writeline(int iColor){
	iThreadLogReading = iThreadLogWorking;
	for (int i = 0; i < iThreadLogWorking; i++){
		vecStackColors.push(iColor);
	}
	notifyAll();
	while (!vecStackColors.empty()){
		try {
			wait();
		} catch (InterruptedException e) {
		}
	}
}

// Leggo il colore e poi processo	
public synchronized int readline(){
	while (vecStackColors.empty()){
		try {
			wait();
		} catch (InterruptedException e) {
		}
	}

	int iReturn = vecStackColors.lastElement();
	return iReturn;
}

// Processato aspetto che tutti i thread abbiano processato
// e poi notifico di leggere un'altra riga
public synchronized void readlineEnd(){
	vecStackColors.pop();

	if (vecStackColors.empty()) {
		notifyAll();
	} else {
		try {
			wait();
		} catch (InterruptedException e) {
		}
	}
	
	try {
		wait();
	} catch (InterruptedException e1) {
	}		
}