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.
publicclassRThreadextendsThread{intmatriz[];intnumero;publicvoidsetMatriz(int[]matriz){this.matriz=matriz;}publicintgetNumero(){returnnumero;}publicvoidsetNumero(intnumero){this.numero=numero;}publicvoidrun(){// codigo para numeros primos e tenho que mandar um numero primo para cada thread alguem tem alguma ideia? }// fim runimportjava.util.Scanner;publicclassMain{publicstaticvoidmain(String[]args){Scannerentrada=newScanner(System.in);// cadastro os numeros do matrizSystem.out.println("Digite o 1 Valor:");Stringtextoa=entrada.nextLine();inta=Integer.parseInt(textoa);System.out.println("Digite o 2 Valor:");Stringtextob=entrada.nextLine();intb=Integer.parseInt(textob);System.out.println("Digite o 3 Valor:");Stringtextoc=entrada.nextLine();intc=Integer.parseInt(textoc);System.out.println("Digite o 4 Valor:");Stringtextod=entrada.nextLine();intd=Integer.parseInt(textod);System.out.println("Digite o 5 Valor:");Stringtextoe=entrada.nextLine();inte=Integer.parseInt(textoe);System.out.println("Digite o 6 Valor:");Stringtextof=entrada.nextLine();intf=Integer.parseInt(textof);System.out.println("Digite o 7 Valor:");Stringtextog=entrada.nextLine();intg=Integer.parseInt(textog);System.out.println("Digite o 8 Valor:");Stringtextoh=entrada.nextLine();inth=Integer.parseInt(textoh);System.out.println("Digite o 9 Valor:");Stringtextoi=entrada.nextLine();inti=Integer.parseInt(textoi);System.out.println("Digite o 10 Valor:");Stringtextoj=entrada.nextLine();intj=Integer.parseInt(textoj);// variaveisintnum1=a,num2=b,num3=c,num4=d,num5=e,num6=f,num7=g,num8=h,num9=i,num10=j;@SuppressWarnings("unused")intmatriz[]={num1,num2,num3,num4,num5,num6,num7,num8,num9,num10};// Instancia as ThreadsRThreadt1=newRThread();RThreadt2=newRThread();RThreadt3=newRThread();RThreadt4=newRThread();RThreadt5=newRThread();RThreadt6=newRThread();RThreadt7=newRThread();RThreadt8=newRThread();RThreadt9=newRThread();RThreadt10=newRThread();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.
F
fabioEM
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.
publicvoidrun(){
while(true){
}
}
D
dpweimar
importjavax.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 */publicclassRThreadextendsThread{intmatriz[];intnumero;publicvoidsetMatriz(int[]matriz){this.matriz=matriz;}publicintgetNumero(){returnnumero;}publicvoidsetNumero(intnumero){this.numero=numero;}publicvoidrun(){// int numero =// Integer.parseInt(JOptionPane.showInputDialog("Digite um número"));intverificador=this.numero;intflag=0;for(inti=2;i<verificador;i++){intresultado=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 */importjava.util.Scanner;publicclassMain{publicstaticvoidmain(String[]args){Scannerentrada=newScanner(System.in);System.out.println("Digite o 1 Valor:");Stringtextoa=entrada.nextLine();inta=Integer.parseInt(textoa);System.out.println("Digite o 2 Valor:");Stringtextob=entrada.nextLine();intb=Integer.parseInt(textob);System.out.println("Digite o 3 Valor:");Stringtextoc=entrada.nextLine();intc=Integer.parseInt(textoc);System.out.println("Digite o 4 Valor:");Stringtextod=entrada.nextLine();intd=Integer.parseInt(textod);System.out.println("Digite o 5 Valor:");Stringtextoe=entrada.nextLine();inte=Integer.parseInt(textoe);System.out.println("Digite o 6 Valor:");Stringtextof=entrada.nextLine();intf=Integer.parseInt(textof);System.out.println("Digite o 7 Valor:");Stringtextog=entrada.nextLine();intg=Integer.parseInt(textog);System.out.println("Digite o 8 Valor:");Stringtextoh=entrada.nextLine();inth=Integer.parseInt(textoh);System.out.println("Digite o 9 Valor:");Stringtextoi=entrada.nextLine();inti=Integer.parseInt(textoi);System.out.println("Digite o 10 Valor:");Stringtextoj=entrada.nextLine();intj=Integer.parseInt(textoj);intnum1=a,num2=b,num3=c,num4=d,num5=e,num6=f,num7=g,num8=h,num9=i,num10=j;@SuppressWarnings("unused")intmatriz[]={num1,num2,num3,num4,num5,num6,num7,num8,num9,num10};RThreadt1=newRThread();RThreadt2=newRThread();RThreadt3=newRThread();RThreadt4=newRThread();RThreadt5=newRThread();RThreadt6=newRThread();RThreadt7=newRThread();RThreadt8=newRThread();RThreadt9=newRThread();RThreadt10=newRThread();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
ViniGodoy
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
ViniGodoy
publicclassMain{publicstaticvoidmain(String[]args){Scannerentrada=newScanner(System.in);//Leitura dos números.intmatriz=newint[10];for(inti=0;i<10;i++){System.out.println("Digiteo"+(i+1)+"valor:");Stringtexto=entrada.nextLine();matriz[i]=Integer.parseInt(texto);}//Disparo das threadsRTThreadrts[]=newRTThread[10];for(inti=0;i<10;i++){RTThreadrt=newRTThread(matriz[i]);rt.start();rts[i]=rt;}//Aguardando o resultado e inserindo no ArrayListArrayList<Integer>primos=newArrayList<Integer>();for(RTThreadthread:rts){thread.join();//Espera a thread terminarif(rts.isPrimo()){//Se era primoprimos.add(rts.getNumero());}}System.out.println("Primos: "+primos);}}
V
ViniGodoy
Sua classe RTThread deverá ficar mais ou menos assim:
importjavax.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 */publicclassRThreadextendsThread{privateintnumero;privateboolprimo=false;publicRTThread(intnumero){super();this.numero=true;}publicintgetNumero(){returnnumero;}publicboolisPrimo(){returnisPrimo;}privatebooltestaPrimo(intnumero){if(numero==2){//Dois sempre é primoreturntrue;}if(numero%2==0){//Pares, fora o 2, nunca são primosreturnfalse;}//Agora basta dividir pelos ímpares.for(inti=3;i<numero;i+=2){if(numero%i==0){returnfalse;}}returntrue;}publicvoidrun(){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
dpweimar
Muito Obrigado com a dica consegui fazer!
vou olhar esta Otimização.
Muito Obrigado.
D
dpweimar
/* * 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 */publicclassRThreadextendsThread{intnumero;publicintgetNumero(){returnthis.numero;}publicvoidsetNumero(intnumero){this.numero=numero;}publicvoidrun(){intflag=0;for(inti=2;i<this.numero;i++){intresultado=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 */importjava.util.ArrayList;importjava.util.Scanner;publicclassMain{publicstaticvoidmain(String[]args)throwsInterruptedException{intmatriz[]=newint[10];Scannerentrada=newScanner(System.in);for(inti=0;i<10;i++){inta=i+1;System.out.println("Digite o "+a+"º Valor:");Stringtextoa=entrada.nextLine();matriz[i]=Integer.parseInt(textoa);}ArrayList<Integer>listaPrimos=newArrayList<Integer>();RThreadt1=newRThread();RThreadt2=newRThread();RThreadt3=newRThread();RThreadt4=newRThread();RThreadt5=newRThread();RThreadt6=newRThread();RThreadt7=newRThread();RThreadt8=newRThread();RThreadt9=newRThread();RThreadt10=newRThread();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(intj=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
ViniGodoy
Se sua variável flag só vai ter os valores 0 e 1, pq não declara ela como boolean?