Salve a tutti,
iniziando a studiare i Thread mi sono imbattuto in un problema che mi chiedeva di trovare i numeri primi presenti in un array contenente i primi 100.000 numeri naturali utilizzando 5 thread. Prima di pensare ad una soluzione concorrente per i thread, volevo provare a trovare i numeri primi con un thread alla volta (ripetendo 5 volte la ricerca, dunque). Ho utilizzato synchronized per fare in modo che mentre un thread cerca i numeri primi, non lascia spazio agli altri "colleghi", tuttavia l'output non è quello atteso. I thread si alternano comunque (ignorando synchronized) e, inoltre, a volte uno stesso thread restituisce due volte lo stesso numero primo trovato. Perché ?

codice:
package thread;
public class ThreadJava implements Runnable{
	
	static int listofNumber[]=new int[100000];
	static Thread t;
	static int numOfThread=1;
	
	
	public ThreadJava() throws InterruptedException {
		t = new Thread(this);
		t.setName("Thread number "+ numOfThread);
		numOfThread++;
		t.start();
		
	}
	
	public static boolean isPrime(int n)
    {
        if (n < 2) { return false; }
        if (n == 2) { return true; }
        if (n % 2 == 0) { return false; }
        int d = 3;
        while (d * d <= n)
        {
            if (n % d == 0) { return false; }
            d += 2;
        }
        return true;
    }
	
	public static void generator () {
		for (int i=0; i<100000; i++) {
			listofNumber[i]=i;
		}
	}
	
	synchronized public void getNum () {
		for ( int i=0; i < listofNumber.length; i++) {
			if (isPrime(listofNumber[i])) {
				System.out.println(listofNumber[i] + " founded by " + t.getName());
			}
		}
	}
	
	public void run() {
		getNum();
	}
	
	
	public static void main(String[] args) throws InterruptedException 
	{
		generator();
		new ThreadJava (); 
		new ThreadJava (); 
		new ThreadJava (); 
		new ThreadJava (); 
		new ThreadJava (); 
		
			
		System.out.println ( "Start" );
	}

	
	

}