Threads são fluxos de execução que rodam
dentro de um processo (aplicação). Normalmente
os threads compartilham regiões de memória, mas
não necessariamente. Lembre-se de encapsulamento. Processos
permitem que o seu sistema operacional execute mais de uma aplicação
ao mesmo tempo, enquanto que threads permitem que sua aplicação
execute mais de um método ao mesmo tempo.
A maioria dos programas simples que fazemos durante o curso
só têm um único fluxo de execução.
Estes programas não executam duas coisas (dois pedaços
de código) simultaneamente. Grande parte do software
de qualidade escrito hoje faz uso de mais de uma linha de execução,
mais de um thread. São os chamados programas multithreaded.
O seu browser de hipertexto consegue fazer o download de vários
arquivos ao mesmo tempo, gerenciando as diferentes velocidades
de cada servidor e ainda assim permite que você continue
interagindo, mudando de página no hipertexto enquanto
o arquivo nem foi carregado totalmente? Isto não seria
possível sem o uso de threads.
O seu editor de textos permite que você vá editando
o começo do arquivo, enquanto ele está sendo carregado
do disco? Editar e carregar do disco são atividades que
não podem ser intercaladas de maneira simples em um pedaço
de código. Seu editor está usando threads, essas
atividades estão sendo feitas em paralelo.
Se sua máquina só possui um processador, esse
paralelismo é um falso paralelismo. O processador tem
seu tempo dividido em pequenos intervalos, em cada intervalo
ele executa uma das atividades e você tem a sensação
de que tudo está funcionando ao mesmo tempo, simultaneamente.
Se você é um felizardo e sua máquina tem
mais de um processador, então seu ambiente será
capaz de mapear seus threads em hardware e você terá
realmente processamento paralelo.
Se você olhar a tradução de threads no dicionário
é até capaz que você encontre um desenho
de um carretel de linha ou da rosca de um parafuso, este nome
é bastante feliz. Imagine que seu programa é composto
por várias linhas de execução que funcionam
em paralelo (algumas vezes estas linhas podem se juntar, outras
se dividir). Cada linha de execução cuida de uma
tarefa: transferir um arquivo, tratar a entrada do usuário,
mostrar sua janela na tela, etc.
Threads é uma invenção recente se comparada
com o restante da linguagem. Algumas outras linguagens (bem
poucas) fornecem facilidades para lidar com threads, exemplo:
Modula-3. Também conhecidos como lightweight processes,
threads são um recurso extremamente difícil de
se implementar, de modo que é possível dizer que
ou seu ambiente de programação oferece facilidades
para lidar com eles, ou você não vai querer implementá-los/usá-los.
CRIANDO THREADS USANDO INTERFACES OU HERANÇA
Existem duas maneiras básicas de criar threads em Java,
usando interfaces e usando herança. Usando herança
(extendendo a classe Thread), sua classe já é
um thread, que quando tiver seu método start() chamado
vai executar tudo o que estiver no método run() em paralelo.
Usando interfaces, você define uma classe que implementa
a interface Runnable, e cujo método run() vai ser executado
por um thread.
HERANÇA USADA PARA CRIAR THREADS
Nós faremos uma corrida de Threads: A e B. Eles serão
iniciados depois que o programa principal (main) começar.
A sai com alguma vantagem pois é iniciado primeiro, depois
sai B. A cada loop estes Threads são obrigados a fazer
uma pausa por intervalo aleatório até completarem
4 loops: 0,1,2,3,4. No final, pedimos ao programa principal
que espere os Threads terminarem seus ciclos para se juntar
a eles (método join() da classe thread).O método
join não retorna enquanto o seu thread não terminar.
CODIGO
public class MeuThread extends Thread {
public MeuThread(String nome) {
super(nome);
}
public void run(){ // o metodo que vai ser executado no thread
tem sempre nome run
for (int i=0; i<5; i++) {
System.out.println(getName()+ " na etapa:"+i);
try {
sleep((int)(Math.random() * 2000)); //milisegundos
} catch (InterruptedException e) {}
}
System.out.println("Corrida de threads terminada:"
+ getName());
}
}
class CorridaThreads {
public static void main (String args[]){
MeuThread a,b;
a=new MeuThread("Aluno 1");
a.start();
b=new MeuThread("Aluno 2");
b.start();
try {a.join(); } catch (InterruptedException ignorada) {}
try {b.join(); } catch (InterruptedException ignorada) {}
}
}
Saída
do programa
Aluno 1 na etapa:0
Aluno 2 na etapa:0
Aluno 2 na etapa:1
Aluno 1 na etapa:1
Aluno 2 na etapa:2
Aluno 1 na etapa:2
Aluno 1 na etapa:3
Aluno 2 na etapa:3
Aluno 2 na etapa:4
Corrida de threads terminada:Aluno 2
Aluno 1 na etapa:4
Corrida de threads terminada: Aluno 1
|