Thread e numeros primos!

9 respostas
D

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.

9 Respostas

A

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.

F

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){


}
}
D
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
/*
 * 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.

V

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.

V
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);
   }
}
V
Sua classe RTThread deverá ficar mais ou menos assim:
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

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.

D

Muito Obrigado com a dica consegui fazer!

vou olhar esta Otimização.

Muito Obrigado.

D
/*
 * 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
/*
 * 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!");
			}

		}

	}
}

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

V

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

Criado 24 de novembro de 2009
Ultima resposta 26 de nov. de 2009
Respostas 9
Participantes 4