Threads de Respostas

Olá …
Sei que não se trata de um problema em específico em Java, mas como estamos desenvolvendo o sistema em java vai aí minha dúvida.

Trabalho em uma empresa voltada para a agricultura e estamos implantando um sistema para cálculos de umidade de solo, como são várias threads que executam o mesmo calculo mas com valores diferentes não estamos conseguindo juntar as respostas, essas threads são divididas em Job1, Job1:1, Job1:2

Como o cáculo é muito complexo prefiro sugerir um exemplo mais simples, mas a idéia é a mesma. Supondo que tenhamos um programa que soma valores em um vetor e temos um vetor de 100 posições, para agilizar o calculo dividimos esse vetor em dois Job1:1 e Job1:2. No caso temos um job pai que seria o Job1 e os outros dois seriam job filho. Após as referidas threads terem retornado o calculo é preciso achar o Job pai desses dois filhos, aí que está o problema; não estou chegam em uma solução concreta.

Pois, tenho uma fila de JOBs, onde tem job1:1, 1:2, 2:1, 2:2, 2:3, 3:1, 3:2 e é preciso achar o job correspondente a cada um desses filhos criados. Alguem poderia me ajudar

Grato e Obrigado.

Eu não sei se eu entendi muito bem o seu problema…
Me corrija se eu estiver errado, mas pelo que eu entendi vc está querendo dividir o processamento em threads, ex:

a Thread Job1 vai executar mais duas threads para fazer um certo calculo e depois os resultados serão juntados no Job pai novamente.

–Job1
----Job1:1
----Job1:2

–Job2
----Job2:1
----Job2:2
----Job2:3

E no método que executou as Thread Pais (Job1, Job2), vc analisaria os resultados?

É exatamente isso aí.

Olá!

Antes de tentarmos achar uma solução, precisamos analisar algumas coisas.

Estes calculos são de valores que estão em memória? Um arquivo texto? Um bd?

Se os dados estão em memória, não vai adiantar muito termos um programa orientado a CPU com threads. Agora se você tem muito acesso a disco, já justifica.

att,

Sim, após haver a junção das resposta, os valores são armazenados em um arquivo .csv

spiderman, imaginando algo para a resolução do seu exemplo, criei o seguinte código:
Dê uma olhada e veja se ajuda a entender…

Classe principal

[code]public class Main {
public static void main(String[] args) {
Job1 job1 = new Job1();
job1.processa();
}

}[/code]

Classe que representa um Job, é responsável por chamar outras threads para processar e junta os resultados depois

[code]public class Job1 {

private int numeros[];
public int soma1,soma2;
public final int TAM_VETOR = 100000;

public Job1(){
    soma1 = 0;
    soma2 = 0;
    numeros = new int[TAM_VETOR];
    for (int i=0;i<TAM_VETOR;i++)
        numeros[i] = i+1;
}

public void processa(){
    try{
        JobFilho1 filho1 = new JobFilho1(this, true);
        JobFilho1 filho2 = new JobFilho1(this, false);
        filho1.start();
        filho2.start();
        filho1.join();
        filho2.join();
        System.out.printf("A soma total foi %d\n", soma1+soma2);
    }catch(Exception e){
        System.out.println(e.toString());
    }
}

public int[] getNumeros() {
    return numeros;
}

public void setSoma1(int soma1) {
    this.soma1 = soma1;
}

public void setSoma2(int soma2) {
    this.soma2 = soma2;
}

}[/code]

Classe responsável pelo processamento. Executa o processamento e depois retorna o valor para o pai.

[code]public class JobFilho1 extends Thread {

private Job1 pai;
private boolean primeiraMetade;

public JobFilho1(Job1 pai, boolean primeiraMetade) {
    this.pai = pai;
    this.primeiraMetade = primeiraMetade;
}

@Override
public void run() {
    int numeros[] = pai.getNumeros();
    int ini, fim;
    if (primeiraMetade) {
        ini = 0;
        fim = numeros.length / 2;
    } else {
        ini = numeros.length / 2;
        fim = numeros.length;
    }
    int soma = 0;
    while (ini < fim) {
        soma += numeros[ini];
        ini++;
    }

    if (primeiraMetade) {
        pai.setSoma1(soma);
    } else {
        pai.setSoma2(soma);
    }
}

}[/code]

Acho que o código está bem auto-explicativo, caso não consiga entender algo é só falar.

Um código que vale ser comentado é o método join().
Ele trava a thread atual (no caso o objeto Job1) até que a thread seja encerrada, ou seja, o código que soma os dois resultados só vai ser executado quando ambas as threads tiverem terminado de somar os numeros.

Espero que ajude,
[]

Eu usaria Futures e Callables.
http://www.guj.com.br/posts/list/50321.java#264645

Extremamente interessante e fácil a estratégia do ViniGodoy. Outras funcionalidades do Java que eu não conhecia… Vlw!

Muito mais simples do que a minha implementação. Sugiro que siga o conselho dele também… hehehe