Visualizzazione dei risultati da 1 a 4 su 4
  1. #1

    Java, Thread e numeri primi

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

  2. #2
    Utente di HTML.it L'avatar di Alex'87
    Registrato dal
    Aug 2001
    residenza
    Verona
    Messaggi
    5,802
    synchronized impedisce solo che il blocco sia eseguito da più thread contemporaneamente, non impedisce agli altri thread di fare operazioni che non richiedono l'accesso al blocco synchronized.

    Se vuoi che i thread siano eseguiti in sequenza usa join()
    SpringSource Certified Spring Professional | Pivotal Certified Enterprise Integration Specialist
    Di questo libro e degli altri (blog personale di recensioni libri) | ​NO M.P. TECNICI

  3. #3
    Grazie, così funziona!

    Un'altra domanda: ora voglio utilizzarli in maniera concorrente (come dovrebbe essere), ma per far si che ognuno riparta da dove si è fermato l'altro (senza scandire tutto l'array dunque) basta l'utilizzo di wait() e notify()?

  4. #4
    Utente di HTML.it L'avatar di Alex'87
    Registrato dal
    Aug 2001
    residenza
    Verona
    Messaggi
    5,802
    Originariamente inviato da shika92
    Grazie, così funziona!

    Un'altra domanda: ora voglio utilizzarli in maniera concorrente (come dovrebbe essere), ma per far si che ognuno riparta da dove si è fermato l'altro (senza scandire tutto l'array dunque) basta l'utilizzo di wait() e notify()?
    Penso che i 5 thread debbano calcolare numeri primi in parallelo: se il thread 1 calcola, arriva a 10 e poi si ferma e parte 2 ecc tanto vale avere un Thread unico...

    Potresti partizionare l'intervallo di lavoro, ad esempio con 100'000 elementi e 5 thread ognuno lavora su partizioni con 20'000 elementi:

    [0, 20000[
    [20000, 40000[
    ...
    [80000, 100000[

    (estremo sinistro incluso, destro escluso)

    Il primo thread calcola i numeri primi nell'intervallo [0, 20000[, il secondo lavora su [20000, 40000[ ecc e alla fine metti insieme il risultato.
    SpringSource Certified Spring Professional | Pivotal Certified Enterprise Integration Specialist
    Di questo libro e degli altri (blog personale di recensioni libri) | ​NO M.P. TECNICI

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.