Salve, sto cercando di apprendere qualcosa su i threads.

Quindi mi cimento a fare esperimenti.


Ho un array con 1.000.000 di elementi. Ora volevo verificare quante volte si presenta un numero.

Come ottimizzare il programma con i thread cercando di farne partire 3 o 5 e ridurre i tempi di scansione dell'array rispetto ad un programma che scansiona ad 1 posizione per volta in modo crescente o banalmente senza threads. ?!?





Codice PHP:
public class VerificaNumeriEstrattiConThreads implements Runnable  {      
private static 
int contatore 0;      
private 
int intervalloMin;      
private 
int intervalloMax;      
private 
int numeroDaVerificare;      
private 
int[] array;        
    
public 
VerificaNumeriEstrattiConThreads(int numeroDaVerficiare,int[] array, int intervalloMin,int intervalloMax)      
{          
this.numeroDaVerificare numeroDaVerficiare;          this.array = array;          
this.intervalloMin intervalloMin;          this.intervalloMax intervalloMax;      
}        

@
Override      public void run()       
{          
for(
int iintervalloMin<= intervalloMaxi++)          {              
if(array[
i] == numeroDaVerificare)  
{                  
incrementaContatore();              
}          
}                
}      

private 
synchronized void incrementaContatore()      {          
contatore++;      
}            
public static 
int getContatore()      
{          
return 
contatore;      
}            
      
public static 
void main(String[] argsthrows InterruptedException      
{          
NumeriEstratti esnum = new NumeriEstratti(10);            
Thread t1 = new Thread(new VerificaNumeriEstrattiConThreads(1esnum.getArray(), 02));          
Thread t2 = new Thread(new VerificaNumeriEstrattiConThreads(1esnum.getArray(), 35));          
Thread t3 = new Thread(new VerificaNumeriEstrattiConThreads(1esnum.getArray(), 69));                    System.out.println(esnum.toString());          
t1.start();          
t2.start();          
t3.start();                    
t1.join();          
t2.join();          
t3.join();                    
System.out.println(VerificaNumeriEstrattiConThreads.getContatore());                

In questo esempio NumeriEstratti è l'array che in questo esempio per motivi pratici è stato ridotto a grandezza10.


Si può fare di meglio ??? La cosa più bruttina da fare è assegnare ad ogni thread un intervallo da controllare. Ma questo solo se si conosce la grandezza dell'array apriori.

Mettiamo caso esistesse un ArrayList di oggetti o semplicemente di Integer come è possibile farlo in quel caso che è dinamico ??

Come si può ottimizzare la soluzione quì sopra proposta??