Threads em Java Sistemas Operacionais - Laboratório Professor Machado 1
Conceitos de Programação Concorrente Uma unidade concorrente é um componente de um programa que não exige a execução seqüencial, ou seja, que sua execução seja realizada antes ou após a execução de outros componentes do programa O termo programação concorrente é usado no sentido abrangente, para designar a programação paralela e a programação distribuída Concorrência relaciona-se com fluxo de controle: em um programa, existe mais de um fluxo de controle ativo. 2
Fluxo de Execução Execução seqüencial Comandos de controle de fluxo de execução Seqüencial Condicional Iterativo Requisição de execução de unidades explícita:chamada de métodos implícita: ativação de exceções Programa controla a ordem de execução Execução concorrente Cada tarefa é uma unidade de execução autônoma (um thread) Tarefas podem ser totalmente independentes Exemplo: execução de um mesmo método sobre dois objetos (da mesma classe) Tarefas podem necessitar comunicação Programa não controla a ordem de execução 3
Fluxo Seqüencial x Concorrente Fluxo único de execução Vários fluxos de execução tarefa 1 tarefa 2 tarefa 1 tarefa 2 tarefa 3 tarefa 3 cada fluxo possui uma pilha de execução 4
Execução Concorrente Execução concorrente, também conhecida como execução paralela, não significa execução simultânea A execução de unidades concorrentes admite as seguintes possibilidades: Pseudo-paralela: Execução em um único processador; Paralela: Execução em vários processadores que compartilham uma memória; Distribuída: Execução em vários processadores independentes, sem compartilhamento de memória. O programa geralmente não possui controle sobre a ordem e o tempo de execução das unidades concorrentes 5
Conceito de Threads Definição básica: Fluxo de controle seqüencial isolado dentro de um programa. Outra denominação: LightWeight Processes Programas multithreaded: Múltiplos threads concorrentes de execução num único programa, realizando várias tarefas ao mesmo tempo. Exemplo: programa do usuário + coleta de lixo Diferentes threads podem executar em diferentes processadores, se disponíveis, ou compartilhar um processador único Diferentes threads no mesmo programa compartilham um ambiente global (memória, processador, registradores, etc.) 6
Conceito de Threads As linguagens Java e Ada possuem funcionalidades MULTITHREADING na própria estrutura da linguagem. C e C++ necessitam de biblioteca especificapara processamento MULTITHREADING Posix p_thread 7
Threads em JAVA Em Java, threads são implementadas como uma CLASSE Pacote java.lang.thread É uma extensão da classe Thread Contrutores: public Thread (String nome_da_thread); public Thread ( ); // o nome sera Thread Thread-1, Thread-2, 8
Principais métodos start(): inicia a execução da thread (método run) suspend(): suspende a execução da thread que está executando sleep(): faz a thread que está executando dormir por um tempo determinado yield(): faz a thread que está executando dormir por um tempo indeterminado resume(): resume a execução de uma thread suspensa stop(): termina a execução de uma thread; a thread não pode ser mais executada. 9
Principais métodos join(): método que espera o término da THREAD para qual foi enviada a mensagem para ser liberada. interrupt(): método que interrompe a execução de uma THREAD. interrupted(): método que testa se uma THREAD está ou não interrompida. 10
Estados de uma thread Criação: Neste estado, o processo pai está criando a thread que é levada a fila de prontos; Execução: Neste estado a thread está usando a CPU; Pronto: Neste estado a thread avisa a CPU que pode entrar no estado de execução e entra na fila de prontos; Bloqueado: Neste estado, por algum motivo, a CPU bloqueia a thread, geralmente enquanto aguarda algum dispositivo de I/O; Término: Neste estado são desativados o contexto de hardware e a pilha é desalocada. Esperando e Finalizado. 11
Estados de uma thread 12
Sincronização e Coordenação de Threads Utilizar os métodos multuamente excludentes de um objeto como do tipo synchronized em Java. Utilizar os métodos wait( ) e notify( ) para bloquear e liberar, respectivamente, as threads. 13
A interface Runnable Para utilizar multithreads em Java é necessário instanciar um objeto de uma classe que estende a classe básicathread, certo? Uma vez que Java não possui herança múltipla, como eu posso utilizar um objeto, cuja classe já é derivada, como no caso da ClasseThread? public class Filho extends Pai extends Thread {. } // isto nao eh possivel em Java 14
A interface Runnable A solução encontrada em Java foi a utilização de uma interface: Runnable No caso, tem-se de implementar esta interface, que possui o método run( ). public class Filho extends Pai implements Runnable Ao implementar uma interface, a classe se capacita a ser tratada como se fosse um objeto do tipo da inteface implementada. Se a classe Filho implementar a interface Runnable, ela pode ser tratada como tal. 15
A interface Runnable Cria-se uma thread (Classe Thread), passando para o seu construtor uma referência do objeto que implementa a interface Runnable. Thread uma_thread = new Thread(Runnable obj_thread) Thread uma_thread = new Thread(Runnable obj_thread, nome_da_thread) String 16
Semáforos (Tanenbaum) Definição Sincronização de Processos Bloqueantes Baixo Nível Composto por: Duas Primitivas: UP e DOWN Inteiro não negativo Fila de processos 17
Semáforos (Tanenbaum) Definição UP(s) se s = 0 e existem processos bloqueados então: libera um dos processos Senão: s := s + 1 DOWN(s) se s > 0 então: s:= s 1 senão: processo é bloqueado 18
Semáforos (Tanenbaum) Observações UP e DOWN devem ser atômicos UP representa a primitiva V DOWN representa a primitiva P O contador do semáforo representa o número de recursos disponíveis 19
Semáforos (Java) Criação Modelados pela classe Semaphore Na criação de um objeto pode-se especificar: Valor do contador do semáforo Modo de gerenciamento da fila de processos bloqueados (FIFO ou não ordenada) 20
Semáforos (Java) Criação Protótipo Semaphore(int permits, boolean fair) Onde permits: valor inicial do contador do semáforo fair: se verdadeiro define ordenação FIFO da fila de processos bloqueados 21
Semáforos (Java) Requisição/Liberação Requisição (Primitiva P) Métodos bloqueantes Métodos bloqueantes com timeout Métodos Não bloqueantes Liberação (Primitiva V) Métodos Não bloqueantes 22
Semáforos (Java) Requisição Protótipos Bloqueantes acquire() acquire(int permits) Não Bloquantes tryacquire(int permits, long timeout, TimeUnit unit) Onde permits: decremento do contador do semáforo timeout: tempo de espera pela permissão ao acesso 23
Semáforos (Java) Liberação Protótipos release() release(int permits) Onde Permits: incremento do contador do semáforo 24
Semáforos (Java) Status availablepermits() Informa o número de acessos permitidos no momento getqueuelength() Retorna o número de threads bloquadas Apenas uma estimativa (sem sincronização) 25