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

Rispondi quotando