1. Este site usa cookies. Ao continuar a usar este site está a concordar com o nosso uso de cookies. Saber Mais.

Ajuda a correr array de forma sequencial em Java

Discussão em 'Programação' iniciada por simjohn, 23 de Outubro de 2012. (Respostas: 3; Visualizações: 931)

  1. simjohn

    simjohn Power Member

    Boas,
    eu estou a fazer um programa em java que consistem em ter um array enorme ( no meu caso com 4000000 de indices) e o que pretendo fazer é ter um programa que conforme o numero de threads que eu indique me corra o array, ou seja se eu tiver 2 threads a primeira vai correr metade do array ( de 0 até 2000000) e a segunda vai correr o restante (de 2000000 a 4000000) e faz a soma( o array não está inicializado, portanto a soma dá sempre 0). O meu problema é que as threads estão sempre a correr só a ultima parte do array. Este é o código que já tenho feito. Agradeço toda a ajuda que me puderem dar.
    Notas sobre o codigo:
    nc= numero de threads
    I= ponto a partir do qual a thread começa a correr o array
    F= ponto onde a thread finaliza a operação sobre o thread
    public class CorrerArray {


    /**
    * @param args
    */
    static int[] ArrayEnorme;
    static int[] ArrayThreads;

    static int total=0;
    static int I;
    static int F;
    static int nc=4;
    static int itensPorThreads;
    static synchronized void soma (int Valor){

    total+=Valor;

    }



    public static void main(String[] args) {
    // TODO Auto-generated method stub



    long start = System.currentTimeMillis();
    ArrayEnorme = new int[40000000];
    Thread[] ArrayThreads = new Thread[nc];
    itensPorThreads= ArrayEnorme.length/nc;
    I=0;
    F=itensPorThreads;
    for (int i=0; i<nc; i++){
    System.out.println("valor I ="+I);
    System.out.println("valor F ="+F);

    ArrayThreads= new Thread(){
    public void run(){
    runA(I,F,1);
    }
    };

    if (i==nc-1){
    System.out.println("Parou");
    }
    else{
    I=F;
    F+=itensPorThreads;}

    };

    for (int i=0; i<nc; i++){
    ArrayThreads.start();
    };








    System.out.println("Soma "+total);
    long elapsed = System.currentTimeMillis() - start;
    System.out.println("Tempo "+elapsed);
    }

    public static void runA (int init, int fim, int NumP){

    System.out.println("valor init"+ init + "valor fim "+fim);
    for (int b=0; b<NumP; b++ ){

    for (int i=init; i<fim; i++)
    soma (ArrayEnorme);


    }

    }
    }
     
  2. Hi World!

    Hi World! Power Member

    Não seria melhor criares uma classe baseada em Thread e, assim, forneceres os índices que queres que eles te contem?

    Exemplo:
    Código:
    public class CounterThread extends Thread{
     public int initialIndex;
     public int nIndexes;
    
     CounterThread(int iI, int nI){
      this.initialIndex = iI;
      this.nIndexes = nI;
     }
    
     @Override
     public void run(){
       //Inserir ciclo for para contagem...
     }
    }
    
    Depois disso, nesse ficheiro, é só chamar um objecto dessa classe e correr essa thread:
    Código:
    //...
     CounterThread ct = new CounterThread(/*inserir parâmetros*/);
     ct.start();
    //...
    
     
  3. simjohn

    simjohn Power Member

    Obrigado pela dica. Mas da maneira que estas a dizer, dá para fazer para varias threads, isto é, se eu quiser 1/2/4/6 threads ou tenho de as andar a criar manualmente?
     
  4. Hi World!

    Hi World! Power Member

    Dá para criar as que quiseres. :)

    Apenas, no ciclo for que tens apresentado, deves fazer isto:
    Código:
    [COLOR=#EDEDED]for (int i=0; i<nc; i++){[/COLOR]
    [COLOR=#EDEDED]System.out.println("valor I ="+I);[/COLOR]
    [COLOR=#EDEDED]System.out.println("valor F ="+F);[/COLOR]
    
    [COLOR=#EDEDED]ArrayThreads[i] = new CounterThread(/*metes os parâmetros correspondentes*/);
    [/COLOR][COLOR=#EDEDED]ArrayThreads[i].start();[/COLOR]
    [COLOR=#EDEDED]};[/COLOR]
    
    Obviamente que a instância do array de threads será:
    Código:
    [COLOR=#EDEDED]CounterThread[] ArrayThreads = new [/COLOR][COLOR=#EDEDED]Counter[/COLOR][COLOR=#EDEDED]Thread[nc];[/COLOR]
    
    Espero que a ajuda tenha ido ao problema que tens. :)
     

Partilhar esta Página