You are on page 1of 12

Sistemas Distribudos

THREADS
Prof. Gregorio Perez Peiro gregorio@uninove.br

LICENA

DE

USO
Sistemas Distribudos - SD05 v092 - prof. Gregorio Perez Peiro

Este material est disponvel sob a licena CreativeCommons 2.5 Brasil de Atribuio-uso No Comercial Compartilhamento pela mesma licena 2.5 Brasil
http://creativecommons.org/licenses/by-nc-sa/2.5/br/

Voc pode:

copiar, distribuir, exibir e executar a obra criar obras derivadas

Sob as seguintes condies: Atribuio Uso No-Comercial Compartilhamento pela mesma Licena

Voc deve dar crdito ao autor original, da forma especificada pelo autor ou licenciante Voc no pode utilizar esta obra com finalidades comerciais Se voc alterar, transformar, ou criar outra obra com base nesta, voc somente poder distribuir a obra resultante sob uma licena idntica a esta

Para cada novo uso ou distribuio, voc deve deixar claro para outros os termos da licena desta obra. Qualquer uma destas condies podem ser renunciadas, desde que Voc obtenha permisso do autor. Nada nesta licena prejudica ou restringe os direitos morais do autor

Threads

ROTEIRO
Sistemas Distribudos - SD05 v092 - prof. Gregorio Perez Peiro

Introduo as Threads
Threads e Java Ciclo de Vida das Threads Prioridade e Escalonamento Classes da Linguagem Java

class Thread interface Runnable

Criao e Execuo de Threads com Java


3

Introduo

THREADS
Sistemas Distribudos - SD05 v092 - prof. Gregorio Perez Peiro

Uma thread um fluxo de controle que ocorre dentro de um aplicativo em execuo, ou de maneira simplificada, uma tarefa (task) de um aplicativo que executada por um computador (host) Tambm conhecidas como processo leve (lightweight process) uma unidade bsica de utilizao da CPU que compartilha seo de cdigo, dados e recursos com outras threads do mesmo processo
Cdigo Dados Arquivos Cdigo Dados Arquivos

Thread

Thread

Um problema com aplicativos de uma nica thread que atividades longas devem ser comcludas antes que outras atividades se iniciem (efeito comboio). Um aplicativo com mltiplas threads pode aumentar o desempenho em sistemas de um nico processador simulando uma concorrncia quando uma thread no puder prosseguir, outra pode utilizar o processador.
4

Processo com uma thread

Processo com mltiplas thread

Introduo

EXEMPLO

DE

THREADS
Sistemas Distribudos - SD05 v092 - prof. Gregorio Perez Peiro

Processador de Texto com 3 fluxos de controle ( threads)

Figura extrada de A.Tanenbaum [01]

prof. Gregorio Perez Peiro

Sistemas Distribudos

Threads

Introduo

THREADS
Sistemas Distribudos - SD05 v092 - prof. Gregorio Perez Peiro

Em um aplicativo com mltiplas threads em um sistema com mltiplos processadores, as threads podem ser distribudas pelos processadores (se estiverem disponveis) de modo que mltiplas tarefas so realizadas concorrentemente e o aplicativo pode operar de modo mais eficiente sem a necessidade de implementar vrios processos Note que implementar um ambiente Multithreading diferente que implementar um ambiente Multitarefa (em que cada processo pode possuir uma ou mais threads)!

Naturalmente, haver uma freqente exigncia de sincronizar as threads para que funcionem corretamente, evitando os problemas como deadlock , entre outros. Sub-processos (tarefas) tem seu espao de endereamento independente e protegido, enquanto threads trabalham dentro do mesmo espao de endereamento no protegido, podendo alterar dados de outras threads.

Introduo

PARADIGMA MULTITAREFA
Sistemas Distribudos - SD05 v092 - prof. Gregorio Perez Peiro

Em um ambiente Multitarefa os dados so separados por definio: cada um tem sua prpria pilha para as variveis locais e cada uma tem sua rea prpria para objetos e outros dados (Oaks, [02]) O compartilhamento de memria restrito informao alocada por outros programas

Sistema Operacional

Aplicativo 1 Aplicativo 2 Aplicativo 3

Memria Local Memria Local Memria Local

Memria Compartilhada 7

Paradigma Multitarefa

CRIANDO
1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13.

UM

APLICATIVO TRADICIONAL
Tipicamente, um aplicativo tradicional executa uma tarefa que pode ser representada genericamente pela classe descrita no cdigo dado. A tarefa possui um ou mais recursos (linha 3: Atributos da Classe) que so associados tarefa no momento de sua criao (linhas 5 a 7: Construtor da Classe). Quando acionada, a tarefa executa suas funes (linhas 9 a 12: Mtodo run() de Execuo da Tarefa) utilizando seus recursos.
Sistemas Distribudos - SD05 v092 - prof. Gregorio Perez Peiro

public class Tarefa { private String recurso;


Atributos

public Tarefa ( String recurso ){ this.recurso = recurso; }

Construtor

public void run(){ System.out.print( Tarefa em execucao\t ); System.out.println( recurso ); }

Execuo da Tarefa

14.

// fecha a Tarefa

prof. Gregorio Perez Peiro

Sistemas Distribudos

Threads

Paradigma Multitarefa

APLICATIVO
1. 2. 3.

COM UMA

TAREFA
Sistemas Distribudos - SD05 v092 - prof. Gregorio Perez Peiro

public class Aplicativo { public static void main( String[] args) {


Instanciao

4.
5.

Tarefa job1 = new Tarefa ( job 1 );


Execuo da Tarefa

6.

7.
8. 9. 10.

job1 .run( );
System.out.println( Fim de Execucao do main ); }

Na linguagem Java, a execuo da tarefa desejada ser possvel com a instanciao de um objeto ( job1 ). Este objeto deve ser declarado e criado com o construtor da classe que exige a passagem de parmetro com o valor que ser atribudo ao recurso da tarefa. O mtodo run() declarado na classe Tarefa responsvel pela utilizao dos recursos desejados.
9

11.

Aplicativo com uma Tarefa

SADA
Sistemas Distribudos - SD05 v092 - prof. Gregorio Perez Peiro

A execuo do programa anterior fornecer a seguinte sada: Tarefa em execucao job 1

Fim de Execucao do main

O mtodo main aciona o programa executa as tarefas seqencialmente: apenas uma instruo executada de cada vez

10

Paradigma Multitarefa

APLICATIVO MULTITAREFA
1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13.

public class Aplicativo { public static void main( String[] args) {

Tarefa job1 = new Tarefa ( job 1 );


Tarefa job2 = new Tarefa ( job 2 ); Tarefa job3 = new Tarefa ( job 3 ); job1 .run( ); job2 .run( ); job3 .run( ); Instanciao

Execuo das Tarefas

System.out.println( Fim de Execucao do main );

Para obter um aplicativo multitarefa basta declarar as tarefas a serem realizadas. O processo principal disparado pelo mtodo main() garante a execuo seqencial das tarefas. Note que, apesar das tarefas serem acionadas pelo mesmo processo principal, as tarefas so escalonadas para o processador uma de cada vez, no havendo compartilhamento de recursos.

Sistemas Distribudos - SD05 v092 - prof. Gregorio Perez Peiro

14.
15.

}
}

11

prof. Gregorio Perez Peiro

Sistemas Distribudos

Threads

Aplicativo Multitarefa

SADA
Sistemas Distribudos - SD05 v092 - prof. Gregorio Perez Peiro

A execuo do programa anterior fornecer a seguinte sada: Tarefa em execucao Tarefa em execucao Tarefa em execucao job 1 job 2 job 3

Fim de Execucao do main

Novamente, as tarefas so executadas seqencialmente linha a linha

Se houver necessidade de compartilhamento de recursos, algum mtodo ter que ser acionado para armazenar o recurso em uma rea da memria global. Quando a tarefa que armazenou o recurso deixar o processamento, outra tarefa que receber a alocao do processador poder ter acesso ao recurso.

12

Introduo

Conceitualmente, threads se comportam como programas. A diferena chave o compartilhamento da estrutura de dados da memria global: Threads podem compartilhar o acesso de modo transparente qualquer objeto dessa estrutura de dados. Cada thread ainda possui seu prprio espao para variveis locais, mas os objetos so compartilhados automaticamente e de modo transparente. (Oaks, [02])

PARADIGMA MULTITHREADING
Sistemas Distribudos - SD05 v092 - prof. Gregorio Perez Peiro

Um ambiente Multithreading compartilha o endereamento de memria


Aplicativo 1

Sistema Operacional

Aplicativo 2

Mquina Virtual Java

Thread 1 Thread 2 Thread 3

Variveis Locais Variveis Locais Variveis Locais

Memria Global 13

Introduo

BENEFCIOS

DO

AMBIENTE MULTITHREADING
Sistemas Distribudos - SD05 v092 - prof. Gregorio Perez Peiro

Compartilhamento de Recursos (Acesso aos Recursos)

Memria e processador podem ser compartilhados (vrios threads diferentes no mesmo espao de endereamento)

Capacidade de Resposta (Transparncia)

Um programa pode continuar executando mesmo que parte dele esteja bloqueada ou executando uma tarefa demorada

Economia (Desempenho)

Alocar memria e processador mais rpido para threads do que para processos

Arquitetura com Mltiplos Processadores (Paralelismo)

Cada thread pode ser executado em paralelo (de maneira concorrente) em um processador diferente
14

prof. Gregorio Perez Peiro

Sistemas Distribudos

Threads

Introduo

THREADS

DO

JAVA
Sistemas Distribudos - SD05 v092 - prof. Gregorio Perez Peiro

Linguagens tradicionais mais antigas (como C/C++, Pascal, etc.) no foram projetadas para dar suporte ambientes multithreading e sua utilizao dependente do acesso s chamadas de sistemas (System Calls) de cada sistema operacional, dificultando a portabilidade do cdigo A linguagem Java inclui primitivas de multithreading como parte da prpria linguagem e, sendo projetada com arquitetura neutra e portvel permite alto grau de portabilidade e interoperabilidade facilitando a manipulao de threads entre plataformas

15

Threads do Java

Em Java, Threads so representadas por instncias da classe Thread definida no pacote java.lang (pacote com as classes fundamentais do projeto Java) e so criadas como qualquer outro objeto Java com a diferena de utilizar um mtodo especial definido por uma interface (run( ) da interface Runnable) que avisa a Mquina Virtual para iniciar a execuo do cdigo da thread como um fluxo separado.

CLASS THREAD
Sistemas Distribudos - SD05 v092 - prof. Gregorio Perez Peiro

package java.lang; pubilic class Thread implements Runnable {

// alguns construtores
public Thread( ); public Thread( Runnable target ); public Thread( ThreadGroup group, Runnable target); public Thread( String name ); public Thread( ThreadGroup group, String name ); public Thread( Runnable target, String name ); public Thread( ThreadGroup group, Runnable target, String name, long stackSize );

// ...

16

Threads do Java

CLASS THREAD (CONTINUAO)


Sistemas Distribudos - SD05 v092 - prof. Gregorio Perez Peiro

// Alguns dos principais mtodos public void start ( ); public void run ( ); dispara a execuo da thread: a JVM chama o mtodo run inicia o objeto de execuo

public void interrupt ( );


public long getId ( ) public String getName ( ) public int getPriority ( )

interrompe a thread
retorna a identidade da thread retorna o nome da thread retorna a prioridade da thread para a execuo da

public void setName( String name) altera o nome public void setpriority( int newPriority) altera a prioridade public static void sleep ( long millis ) thread temporariamente por um perodo definido em milissegundos

// ...

17

prof. Gregorio Perez Peiro

Sistemas Distribudos

Threads

Threads do Java

CLASS THREAD (CONTINUAO)


Sistemas Distribudos - SD05 v092 - prof. Gregorio Perez Peiro

public boolean isAlive ( );

testa o estado de ativao

public boolean isInterrupted ( ); testa o estado de interrupo

// ...
// Mtodos Depreciados // No devem ser utilizados por questes de segurana public void destroy ( ); public void stop ( ); public void suspend ( ); public void resume ( ); // ...

18

Threads do Java

CICLO

DE

VIDA

DAS

THREADS
Sistemas Distribudos - SD05 v092 - prof. Gregorio Perez Peiro

Estado novo
Uma nova thread inicia seu ciclo de vida no estado novo

Estado executvel

Neste estado, uma thread est executando sua tarefa

Estado em espera

A thread aguarda um recurso estar disponvel como, por exemplo, outra thread realizar uma tarefa

Estado de espera cronometrada

A thread espera outra thread ou transcorrer um determinado perodo de tempo

Estado terminado

A thread passa para estado quando completa sua tarefa

19

A thread permanece no estado novo at o programa iniciar a thread, colocando-a no estado executvel. A thread passa ao estado de espera atravs de uma sinalizao de bloqueio e retorna ao estado executvel atravs de nova sinalizao de liberao de bloqueio ou aviso de recurso disponvel. Uma thread em espera cronometrada retorna ao estado executvel quando ela sinalizada por outra thread ou quando o intervalo de tempo especificado expirar. Para entrar no estado terminado, a thread deve estar no estado executvel e completar sua tarefa.

Ciclo de Vida das Threads do Java

DIAGRAMA

DE

ESTADO
Sistemas Distribudos - SD05 v092 - prof. Gregorio Perez Peiro

Figura: Deitel [03]

20

prof. Gregorio Perez Peiro

Sistemas Distribudos

Threads

Ciclo de Vida das Threads do java

VISO

DO

SISTEMA OPERACIONAL
Sistemas Distribudos - SD05 v092 - prof. Gregorio Perez Peiro

Do ponto de vista do Sistema Operacional, uma thread executvel vista com os possveis estados: Estado pronto

A thread est esperando que o sistema operacional disponibilize um processador para a alocao

Uma thread no estado em execuo freqentemente utiliza uma pequena quantidade de tempo de processador chamada frao de tempo, ou quantum, antes de migrar de volta para o estado pronto.

Estado em execuo

A thread tem atualmente um processador e est executando

21 Figura: Deitel [03]

Threads

PRIORIDADE
Sistemas Distribudos - SD05 v092 - prof. Gregorio Perez Peiro

Cada thread Java tem uma prioridade As prioridades do Java esto no intervalo entre: MIN_PRIORITY (uma constante de 1) e

MAX_PRIORITY (uma constante de 10).


As threads com uma prioridade mais alta so mais importantes e tero um processador alocado antes das threads com uma prioridade mais baixa A prioridade-padro NORM_PRIORITY (uma constante de valor 5)

22

Threads

ESCALONAMENTO
Sistemas Distribudos - SD05 v092 - prof. Gregorio Perez Peiro

Determina qual thread executada em seguida Uma implementao simples executa threads com a mesma prioridade no estilo revezamento (Round Robin) Threads de prioridade mais alta podem fazer preempo da thread atualmente em execuo Em alguns casos, as threads de prioridade alta podem adiar indefinidamente threads de prioridade mais baixa o que tambm conhecido como inanio ( starvation)

O agendamento de thread dependente de plataforma um aplicativo que utiliza multithreading poderia comportar-se diferentemente em implementaes separadas do Java. Ao projetar applets (miniaplicativos para internet) e outros aplicativos que utilizam threads, voc deve considerar as capacidades de threading de todas as plataformas em que as applets e os aplicativos sero executados.

23

prof. Gregorio Perez Peiro

Sistemas Distribudos

Threads

Implementao de Threads

CRIAO

EXECUO

DE

THREADS
Sistemas Distribudos - SD05 v092 - prof. Gregorio Perez Peiro

Na linguagem Java h duas maneiras de criar uma thread: Declarar uma classe que seja subclasse de Thread

A subclasse deve sobrescrever o mtodo run( ) de Thread Uma instncia (objeto) da subclasse pode ser alocada e iniciada ( start ( ) )

Declarar uma classe que implemente a interface Runnable

A classe deve implementar o mtodo run( ) de Runnable Uma instncia da classe pode ser alocada, sendo passada como argumento na criao de uma instncia de Thread e, ento, iniciada ( start ( ) ) public interface Runnable { public void run ( ); }

24

Note que a prpria classe Thread implementa a interface Runnable e, conseqentemente, o mtodo run (). Entre as caractersticas desejadas dos Sistemas Distribudos est a interoperabilidade e a portabilidade dos sistemas que facilita a operao entre sistemas heterogneos. A funo bsica de uma interface fornecer uma padronizao, favorecendo estas caractersticas. As interfaces da linguagem Java tem essa finalidade e, particularmente, Runnable tem o objetivo de fornecer a padronizao para a utilizao de Threads.

Criao de Threads

UTILIZANDO HERANA
1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13.

DA

CLASSE THREAD
Sendo subclasse de Thread, a classe MinhaThread tambm uma Thread. Declaramos um atributo (recurso) que representa um recurso qualquer a disposio da Thread e que pode ser compartilhado (threads podem compartilhar seo de cdigo, dados e arquivos). O recurso tipicamente protegido (private ou protected) como forma de garantir sua integridade.
Sistemas Distribudos - SD05 v092 - prof. Gregorio Perez Peiro

public class MinhaThread extends Thread { private String recurso;


Atributos Construtor

public MinhaThread ( String recurso ){ this.recurso = recurso; }

Thread public void run(){ System.out.print( Thread em execucao\t ); System.out.println( recurso ); }

Execuo da

14.

// fecha a Thread

25

No exemplo (e de um modo geral) no foram criados mtodos de acesso para o recurso protegido para garantir maior segurana. Assim, o mtodo construtor responsvel por associar um recurso a thread; esta atribuio obrigatria e a nica maneira de atribuir um valor ao recurso. O mtodo run() definido a sobreposio do mtodo run () que esta implementado na Thread e tem a funo (neste exemplo) de exibir a informao de que a Thread est em execuo e o valor do recurso.

prof. Gregorio Perez Peiro

Sistemas Distribudos

10

Threads

Execuo

CRIANDO
1. 2. 3.

UMA

THREAD
Sistemas Distribudos - SD05 v092 - prof. Gregorio Perez Peiro

public class Processo { public static void main( String[] args) {


Instanciao

4.
5.

MinhaThread job1 = new MinhaThread ( job 1 );


Execuo da Tarefa

6.

7.
8. 9. 10.

job1 .start( );
System.out.println( Fim de Execucao do main ); }

11.

26

A criao da thread segue a mesma regra da instanciao de qualquer outro objeto pela linguagem Java: o objeto ( job1 ) deve ser declarado e criado com o construtor da classe que exige a passagem de parmetro com o valor que ser atribudo ao recurso da thread. O mtodo start() declarado na classe Thread e herdado pela classe MinhaThread usado para disparar a tarefa criada. Este mtodo altera o estado da thread de novo para executvel onde ganhar o direito de utilizar o processador.

Usando subclasse de Thread primeiro Exemplo

O escalonador de curto prazo do sistema operacional ir selecionar, entre as threads em estado executvel, qual utilizar o processador em determinado momento e qual ordem de alocao. Neste momento de transferncia para o processador, o sistema operacional v a thread em um estado de executando sendo responsvel pela chamada do mtodo run().

SADA
Sistemas Distribudos - SD05 v092 - prof. Gregorio Perez Peiro

A execuo do programa anterior fornecer a seguinte sada: Fim de Execucao do main Thread em execucao 1

Note que a mensagem exibida na ltima linha do mtodo main a primeira a ser exibida e depois exibida a mensagem da thread criada anteriormente O mtodo main que aciona o programa tambm uma thread e este tem prioridade de execuo, alocando o espao de endereamento de memria antes da thread criada

27

Execuo

APLICATIVO MULTITHREADING
Sistemas Distribudos - SD05 v092 - prof. Gregorio Perez Peiro

1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13.

public class Processo { public static void main( String[] args) {

Instanciao

MinhaThread job1 = new MinhaThread ( job 1 );


MinhaThread job2 = new MinhaThread ( job 2 ); MinhaThread job3 = new MinhaThread ( job 3 ); job1 .start( ); job2 .start( ); job3 .start( );

Uma vez que criamos a classe MinhaThread que implementa uma thread, podemos instanciar quantas threads desejarmos usando a mesma sintaxe.

Execuo das Threads

System.out.println( Fim de execucao do main );

14.
15.

}
}

28

prof. Gregorio Perez Peiro

Sistemas Distribudos

11

Threads
Cada vez que o programa for executado fornecer as mesmas informaes da resposta em ordens diferentes. Quando foram instanciadas, as trs threads foram criadas na memria (estado novo) e quando deu-se o comando start(), as trs chamaram o mtodo run() e passa-ram execuo (estado executvel). Isto ocorreu dentro do escopo do mtodo main() e as trs se tornaram ativas concorrentemente na memria. A ordem de exibio das mensagens se tornou uma conseqncia do escalonamento das threads e ocorre de acordo com o momento de entrada (disponibilidade do processador), o quantum de tempo e do algoritmo utilizado nesse instante que pode ter influncia do Sistema Operacional. Podemos criar a thread diretamente como implementao da interface Runnable. Essencialmente, no h diferena na implementao da thread utilizando a classe Thread ( extends Thread ) e a interface Runnable ( implements Runnable ). Ambos devem ter seus recursos declarados (atributos da classe) e ambos devem possuir o mtodo run() (sobrescrito ou implementado de Runnable) que executa as tarefas desejadas. A maneira de instanciar o objeto de uma classe que implementa uma interface similar a qualquer outra instanciao.

Usando subclasse de Thread Segundo exemplo

POSSVEIS SADAS
Sistemas Distribudos - SD05 v092 - prof. Gregorio Perez Peiro

Thread em execucao Thread em execucao Thread em execucao 1 Thread em execucao 1 Thread em execucao 2 Thread em execucao Thread em execucao Fim de Execucao do main Thread em execucao

Fim de Execucao do main 3 2

Fim de Execucao do main Thread em execucao 3

1 3 2

29

Criao de Threads

USANDO
1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13.

A INTERFACE

RUNNABLE
Sistemas Distribudos - SD05 v092 - prof. Gregorio Perez Peiro

public class NovaThread implements Runnable { private String recurso;


Atributos

public NovaThread ( String recurso ){ this.recurso = recurso; }

Construtor

Thread public void run(){ System.out.print( Thread em execucao\t ); System.out.println( recurso ); }

Execuo da

14.

} // fecha a NovaThread

30

Execuo

CRIANDO
1. 2. 3.

UMA

THREAD
Sistemas Distribudos - SD05 v092 - prof. Gregorio Perez Peiro

public class ProcessoRunnable { public static void main( String[] args) {


Instanciao

Deve ocorrer a declarao e criao com o construtor da classe que, novamente, exige um parmetro com o valor a ser atribudo ao recurso da classe. A diferena est no fato da interface no possuir um mtodo para disparar a tarefa criada. O mtodo utilizado para isto (start()) declarado na classe Thread que deve ser instanciada. Uma instncia annima (sem objeto declarado) pode ser utilizada para tratar a tarefa criada (job1) como uma thread e, ento, utilizar o mtodo start() para disparar a tarefa criada.

4.
5.

NovaThread job1 = new NovaThread (job 1 );


Execuo da Tarefa

6.

7.
8. 9. 10.

new Thread ( job1 ) .start( );


System.out.println( Fim de Execucao do main ); }

11.

31

prof. Gregorio Perez Peiro

Sistemas Distribudos

12

Threads

Execuo

APLICATIVO MULTITHREADING
Sistemas Distribudos - SD05 v092 - prof. Gregorio Perez Peiro

1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13.

public class ProcessoRunnable { public static void main( String[] args) {

Instanciao

NovaThread job1 = new NovaThread (job 1 );


NovaThread job2 = new NovaThread (job 2 ); NovaThread job3 = new NovaThread (job 3 ); new Thread ( job1 ) .start( ); new Thread ( job2 ) .start( ); new Thread ( job3 ) .start( );

Novamente, podemos aplicar a mesma regra utilizada para criar uma thread a partir da classe NovaThread para criar quantas threads desejarmos.

Execuo das Threads

System.out.println( Fim de execucao do main );

14.
15.

}
}

32

Usando subclasse de Thread Segundo exemplo

Os resultados obtidos sero similares aos obtidos com o uso da classe MinhaThread e devem seguir as mesmas dependncias de disponibilidade e escalonamento j discutidas.

POSSVEIS SADAS
Sistemas Distribudos - SD05 v092 - prof. Gregorio Perez Peiro

Thread em execucao Thread em execucao Thread em execucao Fim de Execucao do main Thread em execucao Thread em execucao Thread em execucao 1 Thread em execucao Fim de Execucao do main Thread em execucao

1 2 3

Fim de Execucao do main 3 2

1 3

Thread em execucao

33

Referncias [01] A.Tanenbaum ; Sistemas Operacionais Modernos, 2 ed. (2000) Ed. Pearson [02] S.Oaks & H. Wong; Java Threads, 3 ed. (2004); Ed. OReilly [03] H.M.Deitel & P.J.Deitel; Java, Como Programar, 6 ed. (2005); Ed. Pearson - www.deitel.com [04] A.Silberschatz, P.Galvin & G.Gagne; Sistemas Operacionais, Conceitos e Aplicaes; 6 ed. (2001); Ed. Campus

prof. Gregorio Perez Peiro

Sistemas Distribudos

You might also like