Tenho o seguinte problema:
Devo usar threads em java para realizar a multiplicação de duas matrizes. Pensei em alocar uma thread para cada linha da primeira matriz (que é um vetor) e multiplicá-lo pela segunda matriz…
Mas eu teria que passar a segunda matriz para cada thread, ocupando muita memória… Tem algum jeito menos tosco de fazer isso?
Como é em Java você não precisa se preocupar se está gastando memória demais, pois você não precisa passar uma cópia da segunda matriz para cada thread (lembre-se que em Java você sempre trabalha com referências).
Além disso esse é um problema que não precisa de sincronização entre threads (embora todas as threads acessem os mesmos dados para leitura, pois
os dados de entrada não serão alterados durante a computação,
e
cada thread trabalha em um pedaço diferente do problema (uma não depende da outra).
Na verdade a única coisa que você vai ter de fazer é algo como Thread.join para saber quando todas as threads terminaram, e o processamento da multiplicação foi concluído.
Java_Vinicius_Machin
e tem mais não vai ser tanto desperdicio assim afinal de contas os Threads estarão todos manipulandos o mesmo objeto (matriz).
jcvijr
Como eu utilizo essa Thread.join ? é um método da classe Thread que devo chamar depois de iniciar as threads?
E
escordeiro
O join serve pra você esperar todas as threads acabarem…seria depois que você lança todas elas, pra esperar a multiplicação gerar todas as células da matriz por exemplo, pra mostrar um resultado só quando todas as threads tivessem terminado os cálculos.
jcvijr
Beleza pessoal, consegui resolver o problema da multilicação com threads!
Agora vem um problema um pouco mais complexo: gostaria de armazenar o tempo que cada thread ficou em execução (entenda o tempo que cada thread ficou no estado “executando”, desconsiderando os estados de “pronta” ou “bloqueada”). Existe algum método pré-definido que consiga retornar esse tempo?
Agradeço se puderem responder!
Diogenes
Utiliza AOP!
pcalcado
jcvijr:
Existe algum método pré-definido que consiga retornar esse tempo?
Faça uma busca no fórum sobre como medir ot empo de execução de um programa
T
thingol
jcvijr:
Beleza pessoal, consegui resolver o problema da multilicação com threads!
Agora vem um problema um pouco mais complexo: gostaria de armazenar o tempo que cada thread ficou em execução (entenda o tempo que cada thread ficou no estado “executando”, desconsiderando os estados de “pronta” ou “bloqueada”). Existe algum método pré-definido que consiga retornar esse tempo?
Agradeço se puderem responder!
Se você estiver usando JDK 5.0, é possível (muito legal!) - veja o javadoc de java.lang.management.ThreadMXBean
T
thingol
importjava.lang.management.*;classDoNothing{publicDoNothing(){}publicvoiddoNothing(intx){x=x;}}classSimpleThreadimplementsRunnable{intiterations;publicSimpleThread(intpIterations){iterations=pIterations;}staticThreadMXBeantmb=ManagementFactory.getThreadMXBean();publicvoidrun(){DoNothingdn=newDoNothing();System.out.printf("Thread %d started.%n",iterations);longt0=tmb.getCurrentThreadUserTime();for(inti=0;i<iterations;++i){for(intj=0;j<10000000;++j){dn.doNothing(j);}}t0=tmb.getCurrentThreadUserTime()-t0;System.out.printf("Thread %d stopped. Took %d USER CPU ms %n",iterations,t0/1000000);}}classTestThreadTiming{publicstaticvoidmain(String[]args){intnThreads=6;Thread[]thr=newThread[nThreads];for(inti=0;i<nThreads;++i){thr[i]=newThread(newSimpleThread(i+1));}for(inti=0;i<nThreads;++i){thr[i].start();}for(inti=0;i<nThreads;++i){try{thr[i].join();}catch(InterruptedExceptionex){ex.printStackTrace();}}System.out.println("All threads stopped. Exiting...");}}
Um exemplo deste código rodando (você vai ver que cada vez este código roda de um jeito diferente:
Olá Pessoal estou no início de meus estudos em Java, Estudo Análise e Desenvolvimento de Sistemas, e gostaria de um esclarecimento.
Numa apostila da Caelum diz que a maquina virtual tenta simular como se várias coisas tivesem acontecendo ao mesmo tempo, mas na verdade é tudo tratado sequencialmente, sendo que o programador determina o nível de prioridade de cada Thread. Gostaria de saber se em um processador de núcleo duplo, triplo ou até qaudrúpulo ocorre da mesma maneira ou eles processam simultaneamente. É uma pergunta elementar, como ainda estou estudando java, ainda nao fiz nenhum projeto profissional nem uso Threads em nenhum projeto, mas procurar saber não custa nada.
Keria tb saber qual o caminho pra engressar no mercado de desenvolvimento java, e seguir neste ramo de profissão. (fora o que já faço que é dar uma estudada)
tinorberto
Oi adrmaster para esclarecer suas duvidas sobre esse assunto de uma olha em um livro de programacao concorrente . O do deitel “java como programar” na edicao 6 tem um capitulo so com esse tema . flw
rmendes08
Na verdade tem que buscar na especificação da JVM. Que faz o escalonamento das Threads é a própria JVM, e não o SO diretamente. Se eu não me enganos, as versões mais atuais da JVM já são capazes de distribuir as threads entre os núcleos de um processador como DualCore ou QuadCore
adrmaster
Eu tenho esse livro em versão PDF, em português. Vlw