Professional Documents
Culture Documents
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:
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
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
Introduo
EXEMPLO
DE
THREADS
Sistemas Distribudos - SD05 v092 - 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
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
Construtor
Execuo da Tarefa
14.
// fecha a Tarefa
Sistemas Distribudos
Threads
Paradigma Multitarefa
APLICATIVO
1. 2. 3.
COM UMA
TAREFA
Sistemas Distribudos - SD05 v092 - prof. Gregorio Perez Peiro
4.
5.
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.
SADA
Sistemas Distribudos - SD05 v092 - prof. Gregorio Perez Peiro
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.
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.
14.
15.
}
}
11
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
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
Sistema Operacional
Aplicativo 2
Memria Global 13
Introduo
BENEFCIOS
DO
AMBIENTE MULTITHREADING
Sistemas Distribudos - SD05 v092 - prof. Gregorio Perez Peiro
Memria e processador podem ser compartilhados (vrios threads diferentes no mesmo espao de endereamento)
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
Cada thread pode ser executado em paralelo (de maneira concorrente) em um processador diferente
14
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
// 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
// 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
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
Sistemas Distribudos
Threads
Threads do Java
// ...
// 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
Estado em espera
A thread aguarda um recurso estar disponvel como, por exemplo, outra thread realizar uma tarefa
Estado terminado
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.
DIAGRAMA
DE
ESTADO
Sistemas Distribudos - SD05 v092 - prof. Gregorio Perez Peiro
20
Sistemas Distribudos
Threads
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
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
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
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 ( ) )
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
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.
Sistemas Distribudos
10
Threads
Execuo
CRIANDO
1. 2. 3.
UMA
THREAD
Sistemas Distribudos - SD05 v092 - prof. Gregorio Perez Peiro
4.
5.
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.
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
Instanciao
Uma vez que criamos a classe MinhaThread que implementa uma thread, podemos instanciar quantas threads desejarmos usando a mesma sintaxe.
14.
15.
}
}
28
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.
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
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
Construtor
Execuo da
14.
} // fecha a NovaThread
30
Execuo
CRIANDO
1. 2. 3.
UMA
THREAD
Sistemas Distribudos - SD05 v092 - prof. Gregorio Perez Peiro
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.
6.
7.
8. 9. 10.
11.
31
Sistemas Distribudos
12
Threads
Execuo
APLICATIVO MULTITHREADING
Sistemas Distribudos - SD05 v092 - prof. Gregorio Perez Peiro
Instanciao
Novamente, podemos aplicar a mesma regra utilizada para criar uma thread a partir da classe NovaThread para criar quantas threads desejarmos.
14.
15.
}
}
32
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
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
Sistemas Distribudos