Escolar Documentos
Profissional Documentos
Cultura Documentos
Marco Antonio
Arquiteto de Software
Fevereiro/2009
Definição
• Praticamente todos os SO's suportam o conceito de processo (programas
independentes que estão isolados dos demais).
• O mecanismo de thread surge com o objetivo de permitir múltiplas atividades
dentro de cada processo.
• Java foi a primeira linguagem (dentre as famosas) que explicitamente incluiu
thread como recurso interno, ao invés de delegar essa tarefa para o sistema
operacional.
• Assim como os processos, as threads são independentes. São caminhos
independentes de execução dentro de um mesmo programa.
• Um processo Java suporta múltiplas threads, que parecem estar sendo
executadas simultaneamente e de forma independente.
• A API de threads em Java é bastante simples. Infelizmente, escrever
programas complexos usando múltiplas threads não é tão simples.
• As threads compartilham a mesma memória, as mesmas variáveis. Dessa
forma, você tem que tomar cuidado para garantir que uma thread não interfira
na execução das demais.
Motivação
• Eficiência
– Download de arquivos pela rede
• Conveniência
– Um relógio
• Aplicações multi-client
– JEE, Swing, RMI, Servidor web, servidor de e-mail
• Transparência
– Existem threads automáticas: garbage collection,
finalização de objetos e outras tarefas de
background da JVM.
Processamento assíncrono
• Algumas aplicações trocam informações com
recursos remotos (através da rede, por exemplo).
• Quando você lê bytes de um socket, caso não haja
nenhum dado disponível, a aplicação ficará
bloqueada até que essa situação se altere, liberando
acesso a outros recursos.
• Dessa forma, enquanto a aplicação não tiver bytes
para ler, poderá continuar outras linhas de execução.
• Não precisamos fazer nenhuma verificação para isso.
Quando houver dados, a aplicação bloqueada será
acordada automaticamente.
Riscos
• Quando várias threads acessam o mesmo
recurso, como campos estáticos, variáveis de
instância você deve tomar cuidado para que
os dados estejam consistentes.
• Para isso, temos o recurso de sincronização,
a única maneira de garantir que duas threads
não acessem ao mesmo tempo determinado
recurso, corrompendo os dados.
Processo sequencial
• Somente uma rotina é
executada por vez
• As demais rotinas, ficam na
fila esperando
ExemploFor
package net.javabasico.thread;
executando
wait( ) E/S
sleep( ) Fim do
Método run( )
@Override
public void run() {
for (int i = 0; i < 1000; i++) {
System.out.println(getName() + " - " + i);
}
}
}
TesteImprimeNome
package net.javabasico.threads;
}
}
Recuperando o nome da thread
package net.javabasico.thread;
minhaThread.setPriority(1);
minhaThread.start();
minhaThread.setPriority(10);
minhaThread.start();
}
}
Vários outros exemplos
• Na sequência temos alguns exemplos de
como trabalhar com threads.
BarraDeProgresso
package net.javabasico.threads;
import javax.swing.*;
@Override
public void run() {
try {
for (int i = 0; i < quantidadeDeSegundos; i++) {
Thread.sleep(1000);
System.out.print(".");
}
JOptionPane.showMessageDialog(null, "Tarefa concluída.");
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
TestaBarraDeProgresso
package net.javabasico.threads;
@Override
public void run() {
UtilPropriedades.imprime(chave, valor);
}
}
TestePropriedades
package net.javabasico.threads;
import java.sql.*;
import com.javabasico.thread.banco.*;