Thread e numeros primos!

Faça um programa que possua um vetor com 10 números inteiros positivos.
O seu programa deverá gerar um ArrayList apenas com os números primos existentes neste vetor.
Entretanto, o cálculo para verificação se um número é ou não primo deve ser feito através de uma Thread.
Esta Thread deve verificar APENAS UM NÚMERO por vez.
Apenas após a verificação de todos os números é que o ArrayList deve ser exibido.

public class RThread  extends Thread{
	int matriz[];
	int numero;
	
	public void setMatriz(int[] matriz ) {
		this.matriz = matriz;
		
	}
	public int getNumero() {
		return numero;
	}


	public void setNumero(int numero) {
		this.numero = numero;
	}
	
	public void run() {
      
	 // codigo para numeros primos e tenho que mandar um numero primo para cada thread alguem tem alguma ideia? 	
		
	}// fim run


import java.util.Scanner;

public class Main {

	public static void main(String[] args) {
		Scanner entrada = new Scanner(System.in);
                // cadastro os numeros do matriz
		System.out.println("Digite o 1 Valor:");
		String textoa = entrada.nextLine();
		int a = Integer.parseInt(textoa);

		System.out.println("Digite o 2 Valor:");
		String textob = entrada.nextLine();
		int b = Integer.parseInt(textob);

		System.out.println("Digite o 3 Valor:");
		String textoc = entrada.nextLine();
		int c = Integer.parseInt(textoc);

		System.out.println("Digite o 4 Valor:");
		String textod = entrada.nextLine();
		int d = Integer.parseInt(textod);

		System.out.println("Digite o 5 Valor:");
		String textoe = entrada.nextLine();
		int e = Integer.parseInt(textoe);

		System.out.println("Digite o 6 Valor:");
		String textof = entrada.nextLine();
		int f = Integer.parseInt(textof);

		System.out.println("Digite o 7 Valor:");
		String textog = entrada.nextLine();
		int g = Integer.parseInt(textog);

		System.out.println("Digite o 8 Valor:");
		String textoh = entrada.nextLine();
		int h = Integer.parseInt(textoh);

		System.out.println("Digite o 9 Valor:");
		String textoi = entrada.nextLine();
		int i = Integer.parseInt(textoi);

		System.out.println("Digite o 10 Valor:");
		String textoj = entrada.nextLine();
		int j = Integer.parseInt(textoj);
                
                // variaveis
		int num1 = a, num2 = b, num3 = c, num4 = d, num5 = e, num6 = f, num7 = g, num8 = h, num9 = i, num10 = j;
		@SuppressWarnings("unused")
		int matriz[] = { num1, num2, num3, num4, num5, num6, num7, num8, num9,
				num10 };

               // Instancia as Threads
		RThread t1 = new RThread();
		RThread t2 = new RThread();
		RThread t3 = new RThread();
		RThread t4 = new RThread();
		RThread t5 = new RThread();
		RThread t6 = new RThread();
		RThread t7 = new RThread();
		RThread t8 = new RThread();
		RThread t9 = new RThread();
		RThread t10 = new RThread();

		t1.setNumero(num1);
		t2.setNumero(num2);
		t3.setNumero(num3);
		t4.setNumero(num4);
		t5.setNumero(num5);
		t6.setNumero(num6);
		t7.setNumero(num7);
		t8.setNumero(num8);
		t9.setNumero(num9);
		t10.setNumero(num10);

		
		t1.start();
		t2.start();
		t3.start();
		t4.start();
		t5.start();
		t6.start();
		t7.start();
		t8.start();
		t9.start();
		t10.start();

		
	}
}

se poder me ajudar com alguma ideia fico grato não quero codigo pronto só ideias Valeu.

Então cara, não sou nenhum master em thread mas ultimamente estou tendo que trabalhar e entender bastante sobre isso.

Na minha opinião, na classe RThread você pode passar todos os parâmetros no construtor, e cuidar com o acesso concorrente entre as variáveis de instância.

Então no programa principal, você tem que dar join em todas as threads para o programa esperar todas as threads calcularem, e então imprimir o arraylist.

Cara de acordo com enunciado bastaria uma thread principal.No metodo run() vc faz a verificação do array indice por indice na sequência ,ou seja, uma por vez.Vc poderia estartar a thread após a 10 leitura do teclado.

public void run(){
while(true){


}
}

[code]import javax.swing.JOptionPane;

/*

  • Faça um programa que possua um vetor com 10 números inteiros positivos.
    O seu programa deverá gerar um ArrayList apenas com os números primos existentes neste vetor.
    Entretanto, o cálculo para verificação se um número é ou não primo deve ser feito através de uma Thread.
    Esta Thread deve verificar APENAS UM NÚMERO por vez.
    Apenas após a verificação de todos os números é que o ArrayList deve ser exibido.

Nome: Douglas Weimar

*/

public class RThread extends Thread {
int matriz[];
int numero;

public void setMatriz(int[] matriz) {
	this.matriz = matriz;

}

public int getNumero() {
	return numero;
}

public void setNumero(int numero) {
	this.numero = numero;
}

public void run() {

	// int numero =
	// Integer.parseInt(JOptionPane.showInputDialog("Digite um número"));
	int verificador = this.numero;
	int flag = 0;

	for (int i = 2; i < verificador; i++) {
		int resultado = verificador % i;

		if (resultado == 0) {
			System.out.println("Esse número não é primo" + numero);
			flag = 1;
			break;
		}
	}

	if (flag == 0) {
		System.out.println("Esse número é primo" + numero);
	}

}// fim run

}// fim class Thread
[/code]

/*
 * Faça um programa que possua um vetor com 10 números inteiros positivos.
   O seu programa deverá gerar um ArrayList apenas com os números primos existentes neste vetor.
   Entretanto, o cálculo para verificação se um número é ou não primo deve ser feito através de uma Thread. 
   Esta Thread deve verificar APENAS UM NÚMERO por vez.
   Apenas após a verificação de todos os números é que o ArrayList deve ser exibido.
   
   Nome: Douglas Weimar

 */

import java.util.Scanner;

public class Main {

	public static void main(String[] args) {
		Scanner entrada = new Scanner(System.in);

		System.out.println("Digite o 1 Valor:");
		String textoa = entrada.nextLine();
		int a = Integer.parseInt(textoa);

		System.out.println("Digite o 2 Valor:");
		String textob = entrada.nextLine();
		int b = Integer.parseInt(textob);

		System.out.println("Digite o 3 Valor:");
		String textoc = entrada.nextLine();
		int c = Integer.parseInt(textoc);

		System.out.println("Digite o 4 Valor:");
		String textod = entrada.nextLine();
		int d = Integer.parseInt(textod);

		System.out.println("Digite o 5 Valor:");
		String textoe = entrada.nextLine();
		int e = Integer.parseInt(textoe);

		System.out.println("Digite o 6 Valor:");
		String textof = entrada.nextLine();
		int f = Integer.parseInt(textof);

		System.out.println("Digite o 7 Valor:");
		String textog = entrada.nextLine();
		int g = Integer.parseInt(textog);

		System.out.println("Digite o 8 Valor:");
		String textoh = entrada.nextLine();
		int h = Integer.parseInt(textoh);

		System.out.println("Digite o 9 Valor:");
		String textoi = entrada.nextLine();
		int i = Integer.parseInt(textoi);

		System.out.println("Digite o 10 Valor:");
		String textoj = entrada.nextLine();
		int j = Integer.parseInt(textoj);

		int num1 = a, num2 = b, num3 = c, num4 = d, num5 = e, num6 = f, num7 = g, num8 = h, num9 = i, num10 = j;
		@SuppressWarnings("unused")
		int matriz[] = { num1, num2, num3, num4, num5, num6, num7, num8, num9,
				num10 };

		RThread t1 = new RThread();
		RThread t2 = new RThread();
		RThread t3 = new RThread();
		RThread t4 = new RThread();
		RThread t5 = new RThread();
		RThread t6 = new RThread();
		RThread t7 = new RThread();
		RThread t8 = new RThread();
		RThread t9 = new RThread();
		RThread t10 = new RThread();

		t1.setNumero(num1);
		t2.setNumero(num2);
		t3.setNumero(num3);
		t4.setNumero(num4);
		t5.setNumero(num5);
		t6.setNumero(num6);
		t7.setNumero(num7);
		t8.setNumero(num8);
		t9.setNumero(num9);
		t10.setNumero(num10);

		
		t1.start();
		t2.start();
		t3.start();
		t4.start();
		t5.start();
		t6.start();
		t7.start();
		t8.start();
		t9.start();
		t10.start();

		
	}
}

consegui fazer cada numero primo separado alguem te alguma ideia de como eu devolvo o valor para add num arrayList na main?
Muito obrigado até agora.

Use o método join() para saber que a thread terminou. E o método getNumero() para pegar o número:

t1.join(); listaPrimos.add(t1.getNumero());

PS: Acho que um for e alguns arrays tornariam o seu código muito menos repetitivo.

[code]public class Main {
public static void main(String [] args) {
Scanner entrada = new Scanner(System.in);

  //Leitura dos números.
  int matriz = new int[10];
  for (int i = 0; i &lt; 10; i++) {
     System.out.println(&quot;Digite o &quot; + (i+1) + &quot; valor:&quot;);
     String texto = entrada.nextLine();
     matriz[i] = Integer.parseInt(texto);
  }

  //Disparo das threads
  RTThread rts[] = new RTThread[10];
  for (int i = 0; i &lt; 10; i++) {
     RTThread rt = new RTThread(matriz[i]);
     rt.start();
     rts[i] = rt;
  }

  //Aguardando o resultado e inserindo no ArrayList
  ArrayList&lt;Integer&gt; primos = new ArrayList&lt;Integer&gt;();
  for (RTThread thread : rts) {
     thread.join(); //Espera a thread terminar
     if (rts.isPrimo()) { //Se era primo
        primos.add(rts.getNumero());
     }
  }

  System.out.println("Primos: " + primos);

}
}
[/code]

Sua classe RTThread deverá ficar mais ou menos assim:

[code]
import javax.swing.JOptionPane;

/*

  • Faça um programa que possua um vetor com 10 números inteiros positivos.
    O seu programa deverá gerar um ArrayList apenas com os números primos existentes neste vetor.
    Entretanto, o cálculo para verificação se um número é ou não primo deve ser feito através de uma Thread.
    Esta Thread deve verificar APENAS UM NÚMERO por vez.
    Apenas após a verificação de todos os números é que o ArrayList deve ser exibido.

Nome: Douglas Weimar
*/

public class RThread extends Thread {
private int numero;
private bool primo = false;

public RTThread(int numero) {
super();
this.numero = true;
}

public int getNumero() {
return numero;
}

public bool isPrimo() {
return isPrimo;
}

private bool testaPrimo(int numero) {
if (numero == 2) { //Dois sempre é primo
return true;
}

  if (numero % 2 == 0) { //Pares, fora o 2, nunca são primos
     return false;      
  }

  //Agora basta dividir pelos ímpares.
  for (int i = 3; i &lt; numero; i+=2) {  
     if (numero % i == 0) {
        return false;
     }
  }
  return true;

}

public void run() {
isPrimo = testaPrimo(numero);
}// fim run

}// fim class Thread [/code]

Note que fiz uma otimização no seu método que testa se é primo. Você não precisa dividir por absolutamente todos os números inferiores ao que está sendo testado para descobrir se ele é primo. Só pelos ímpares (na verdade, só pelos primos inferiores aquele numero, mas isso envolveria saber que primos são esses). Assim, podemos fazer o for pulando de 2 em 2 números, ao invés de 1 em 1.

Muito Obrigado com a dica consegui fazer!

vou olhar esta Otimização.

Muito Obrigado.

[code]
/*

  • Faça um programa que possua um vetor com 10 números inteiros positivos.
    O seu programa deverá gerar um ArrayList apenas com os números primos existentes neste vetor.
    Entretanto, o cálculo para verificação se um número é ou não primo deve ser feito através de uma Thread.
    Esta Thread deve verificar APENAS UM NÚMERO por vez.
    Apenas após a verificação de todos os números é que o ArrayList deve ser exibido.

Nome: Douglas Weimar

*/

public class RThread extends Thread {

int numero;

public int getNumero() {
	return this.numero;
}

public void setNumero(int numero) {
	this.numero = numero;
}

public void run() {

	int flag = 0;

	for (int i = 2; i < this.numero; i++) {
		int resultado = this.numero % i;

		if (resultado == 0) {
			this.numero = -1;
			// System.out.println("Esse número não é primo: " + numero);
			flag = 1;
			break;
		}
	}

	if (flag == 0) {
					
		// System.out.println("Esse número é primo: " + numero );
	}

}// fim run

}// fim class Thread[/code]

[code]
/*

  • Faça um programa que possua um vetor com 10 números inteiros positivos.
    O seu programa deverá gerar um ArrayList apenas com os números primos existentes neste vetor.
    Entretanto, o cálculo para verificação se um número é ou não primo deve ser feito através de uma Thread.
    Esta Thread deve verificar APENAS UM NÚMERO por vez.
    Apenas após a verificação de todos os números é que o ArrayList deve ser exibido.

    Nome: Douglas Weimar

*/

import java.util.ArrayList;
import java.util.Scanner;

public class Main {

public static void main(String[] args) throws InterruptedException {
	int matriz[] = new int[10];
	Scanner entrada = new Scanner(System.in);

	for (int i = 0; i < 10; i++) {
		int a = i + 1;
		System.out.println("Digite o " + a + "º Valor:");
		String textoa = entrada.nextLine();
		matriz[i] = Integer.parseInt(textoa);
	}

	ArrayList<Integer> listaPrimos = new ArrayList<Integer>();

	RThread t1 = new RThread();
	RThread t2 = new RThread();
	RThread t3 = new RThread();
	RThread t4 = new RThread();
	RThread t5 = new RThread();
	RThread t6 = new RThread();
	RThread t7 = new RThread();
	RThread t8 = new RThread();
	RThread t9 = new RThread();
	RThread t10 = new RThread();

	t1.setNumero(matriz[0]);
	t2.setNumero(matriz[1]);
	t3.setNumero(matriz[2]);
	t4.setNumero(matriz[3]);
	t5.setNumero(matriz[4]);
	t6.setNumero(matriz[5]);
	t7.setNumero(matriz[6]);
	t8.setNumero(matriz[7]);
	t9.setNumero(matriz[8]);
	t10.setNumero(matriz[9]);

	t1.start();
	t2.start();
	t3.start();
	t4.start();
	t5.start();
	t6.start();
	t7.start();
	t8.start();
	t9.start();
	t10.start();

	t1.join();
	listaPrimos.add(t1.getNumero());
	t2.join();
	listaPrimos.add(t2.getNumero());
	t3.join();
	listaPrimos.add(t3.getNumero());
	t4.join();
	listaPrimos.add(t4.getNumero());
	t5.join();
	listaPrimos.add(t5.getNumero());
	t6.join();
	listaPrimos.add(t6.getNumero());
	t7.join();
	listaPrimos.add(t7.getNumero());
	t8.join();
	listaPrimos.add(t8.getNumero());
	t9.join();
	listaPrimos.add(t9.getNumero());
	t10.join();
	listaPrimos.add(t10.getNumero());

	for (int j = 0; j < listaPrimos.size(); j++) {
		if (listaPrimos.get(j) != -1) {
			System.out.println("Numero: " + listaPrimos.get(j)
					+ " é Primo!");
		}

	}

}

}[/code]

Código Rodando e Funcional e um pouco Otimizado;
Valeu Pela Força de Todos.

Se sua variável flag só vai ter os valores 0 e 1, pq não declara ela como boolean?