Setembro 2003
   

Tutorial
Um bom tutorial sobre a utilização de Threads, com um exemplo fácil de se aplicar e entender.

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

por Marcus Vinícius de O. Régis
 
Designer by
Danilo de Sousa