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" );
}
}