(Aula 17) Threads em Java
Difícil As Threads thread threads de emjava classificar sãogerenciadaspelajvm. podemser com user criadasdas thread ou kernel Profa. Patrícia A seguintesmaneiras: Fazendo extend Implementandoa D. Criarum CostaLPRM/DI/UFES JVM daclassethread. nova sósuportaum JVM novo p/ rodaro processoemjava interface novo Runnable. 2processo implicaemcriaruma Sistemas Operacionais 2008/1 Java Threads
Especificação API JVM: Java MáquinaVirtual da linguagem Javade programação Java Componentes: Profa. Patrícia JVM: D. CostaLPRM/DI/UFES 3 Sistemas Operacionais 2008/1
Programas A independentes JVM Java compilados são bytecodes Carregador plataforma de execução da Verificador Interpretador JVM consiste de runtime classes de: (Class (Runtime verifier) loader) interpreter) Profa. Patrícia D. CostaLPRM/DI/UFES 4 Sistemas Operacionais 2008/1 JVM
Toda Do thread aplicação (sem considerar Java tem o pelo system menos thread) uma A começa thread. main ponto thread com de vista uma cria thread, do novas desenvolvedor, threads. chamada de o main programa Profa. Patrícia D. CostaLPRM/DI/UFES 5 Sistemas Operacionais 2008/1 Java Threads
Cada Duas classe thread: thread é associada com uma instância da Instanciando Thread. Delegando estratégicas possíveis para criar uma executor (high-level criação/gerência a classe Thread; concurrency da thread objects) para Profa. Patrícia D. CostaLPRM/DI/UFES 6 Sistemas Operacionais 2008/1 Java Threads (2)
A Passando fornecer da aplicação classe o Thread: um código que objeto cria a ser instância Runnable executado de para Thread na o thread. construtor deve Profa. Patrícia D. CostaLPRM/DI/UFES 7 Sistemas Operacionais 2008/1 public class HelloRunnable implements Runnable { Exemplo de criação de Thread em Java public void run() { System.out.println("Hello from a thread!"); public static void main(string args[]) { (new Thread(new HelloRunnable())).start();
Fazendo subclass de Thread (que também (2) Exemplo de criação de em Java implementa Runnable) public class HelloThread extends Thread { Profa. Patrícia D. CostaLPRM/DI/UFES System.out.println("Hello 8 from a thread!"); Sistemas Operacionais 2008/1 public void run() { public static void main(string args[]) { (new HelloThread()).start();
run(): start(): umathread. é tambémtermina. o métodoqueexecutaas Quandoestemétodofinaliza, atividadesde a sleep(intx): thread. antes métodoquedisparaa execuçãode uma dormirporx de Este terminar. métodoquecolocaa métodochamao milisegundos. métodorun( thread para ) Profa. Patrícia D. CostaLPRM/DI/UFES 9 Sistemas Operacionais 2008/1 Principais métodos da Classe Thread
10 join( interrupt( paraqualfoienviadaa ): métodoqueesperao mensagemparaser términodathread interrupted( liberada. de estáounãointerrompida. umathread. ): métodoqueinterrompea ): métodoquetestase umathread execução Profa. Patrícia D. CostaLPRM/DI/UFES 10 Sistemas Operacionais 2008/1 Principais métodos da Classe Thread
11 Estados da thread nascimento Término do tempo de dormida start( ) notify( ) pronta Profa. Patrícia D. CostaLPRM/DI/UFES 11 Sistemas Operacionais 2008/1 esperando dormindo morta bloqueada notifyall( ) wait( ) sleep( ) run( ) executando Alocar um processador E/S Fim do Método run( ) Fim da E/S
12 O Sessão controle de execução sessões críticas em Java é Thread garantido thread por um mecanismo de monitores execução; de código (RC) é executada por apenas uma tiver em que permissão, um deseja determinado executar região instante a RC, bloqueando pede tempo permissão entrada para para Profa. Patrícia http://java.sun.com/docs/books/tutorial/essential/concurrency/index.html Se outras D. CostaLPRM/DI/UFES bloqueia não threads tiver até a liberar permissão (outra thread está executando), 12 Sistemas Operacionais 2008/1 Sincronização de Threads em Java
13 Hansen, Baseada na abordagem de Profa. Patrícia existe. mas sem garantias que uma que waitingthreadentraráno Portanto, um signal éapenas monitor! checar espera) indicação (para os processos uma D. estão CostaLPRM/DI/UFES Isto executar a condição esperando significa que o no estado antes que monitor. devem os começar desejado processos sempre a Monitores em Java 13 Sistemas Operacionais 2008/1
14 Todos Objetos Para monitores os e objetos classes Java possuem são potencialmente um lock intrínseco O fazer chamada a algum método um Profa. Patrícia A objeto lock compartilhado (monitor), deve-se obter o D. lock CostaLPRM/DI/UFES palavra mesmo de um synchronizedé para objeto métodos monitor de classe (static) 14usada (ou classe) para se Sistemas obter java Operacionais o 2008/1 Sincronização de Threads em Java (cont.)
15 Classe Objeto Bloco de código Granularidade de Sincronização Profa. Patrícia D. CostaLPRM/DI/UFES 15 Sistemas Operacionais 2008/1
16 Garante classe um (synchronized) (static que apenas method) método uma thread no escopo vai executar de uma Sincronização de Classe class Buffer { initialize { p = new Pilha(); Profa. Patrícia D. CostaLPRM/DI/UFES 16 Sistemas Operacionais 2008/1 private static Pilha p; public Buffer(){ syncronized static public void Insere( Object _o ) { p.push( _o ); syncronized static public Object Retira() { return p.pop();
17 Garante objeto um (synchronized) que apenas método uma thread no escopo vai executar de um Sincronização de Objeto class Buffer { Profa. Patrícia D. CostaLPRM/DI/UFES 17 Sistemas Operacionais 2008/1 syncronized public void Insere( Object _o ) { private Pilha p; public Buffer(){ p = new Pilha(); p.push( _o ); syncronized public Object Retira() { return p.pop();
18 Garante É garantir conjunto usado exclusão um que de objeto instruções apenas mútua auxiliar uma definidas thread (e.x. this) dentro vai executar para do bloco o Sincronização de Bloco class Buffer { Profa. Patrícia D. CostaLPRM/DI/UFES private Pilha p; public Buffer(){ p = new Pilha(); public void Insere( Object _o ) { syncronized(this) { p.push( _o ); syncronized public Object Retira() 18 Sistemas Operacionais 2008/1 { Object aux; syncronized(this) { aux = p.pop(); return aux;
19 Sincronização São exclusão usados mútua de objetos Bloco (interleave) auxiliares (métodos entre distintos independentes) métodos para evitar public class MsLunch { private long c1 = 0; private long c2 = 0; private Object lock1 = new Object(); private Object lock2 = new Profa. Patrícia D. CostaLPRM/DI/UFES 19 Object(); Sistemas Operacionais 2008/1 public void inc1() { synchronized(lock1){ c1++; public void inc2() { synchronized(lock2){ c2++;
20 Uma Mas thread não está Permite com uma outra thread pode obter um lock que ela já Evita possui outro Profa. Patrícia D. mesma que método um uma método também thread (synchronized) cause o bloqueio chamar de si CostaLPRM/DI/UFES 20 Sistemas Operacionais 2008/1 Sincronização Reentrante
21 Usados Um guarded para coordenar block começa as ações perguntando das threads (polling) se Guarded Blocks uma condição é verdadeira // joy é uma variável compartilhada Profa. Patrícia D. CostaLPRM/DI/UFES 21 Sistemas Operacionais 2008/1 catch (InterruptedException e) { public synchronized guardedjoy(){ while(!joy){ try { wait(); /* bloqueia a thread até algum evento ser notificado. Note que pode ser qualquer evento, não necessariamente o que esperamos */ System.out.println("Joy and efficiency have been achieved!");
22 Sempre use wait dentro de um loop que testa a Mesmo condição esperada foi satisfeita (Abordagem de Hansen). esperando, Não assuma que a interrupção foi para a condição mesma específica que quando que pode o evento estávamos a ser thread que tenha ganhar a esperando condição sido o permissão que não estávamos seja de mais executar a Profa. Patrícia D. CostaLPRM/DI/UFES 22 Sistemas Operacionais 2008/1 Guarded Blocks (cont)
23 Quando Executar uma thread executa o.wait, ela precisa ter o Quando lock uma intrínseco do objeto o e suspende maneira uma o wait a thread simples execução dentro chama de de obter um o wait, método o lock a thread synchronized libera o é lock Profa. Patrícia D. CostaLPRM/DI/UFES 23 Sistemas Operacionais 2008/1 Wait
24 Uma esperando o.notifyall, outra por thread que aquele informa lock obtenha a todas que algo o as lock threads importante vai chamar que estejam Profa. Patrícia D. CostaLPRM/DI/UFES 24 Sistemas Operacionais 2008/1 aconteceu public synchronized notifyjoy(){ NotifyAll (cont.) joy = true; notifyall();
25 Exemplo dos Filósofos class DiningServer { private boolean checkstarving = false; private int numphils = 0; private int[] state = null; private static final int THINKING = 0, HUNGRY = 1, STARVING = 2, EATING = 3; Profa. Patrícia D. CostaLPRM/DI/UFES 25 Sistemas Operacionais 2008/1 private final int left(int i) { return (numphils + i - 1) % numphils; public DiningServer(int numphils, boolean checkstarving) { this.numphils = numphils; this.checkstarving = checkstarving; state = new int[numphils]; for (int i = 0; i < numphils; i++) state[i] = THINKING; System.out.println("DiningServer: checkstarving=" + checkstarving); private final int right(int i) { return (i + 1) % numphils;
26 Exemplo dos Filósofos (cont.) private void seeifstarving(int k) { if (state[k] == HUNGRY && state[left(k)]!= STARVING && state[right(k)]!= STARVING) { state[k] = STARVING; System.out.println("philosopher " + k + " is STARVING"); private void test(int k, boolean checkstarving) Profa. Patrícia D. CostaLPRM/DI/UFES 26 { Sistemas Operacionais 2008/1 if (state[left(k)]!= EATING && state[left(k)]!= STARVING && (state[k] == HUNGRY state[k] == STARVING) && state[right(k)]!= STARVING && state[right(k)]!= EATING) state[k] = EATING; else if (checkstarving) seeifstarving(k); // simplistic naive check for starvation
27 Exemplos public synchronized void takeforks(int i) { state[i] = HUNGRY; test(i, false); while (state[i]!= EATING) try {wait(); catch (InterruptedException e) { Profa. Patrícia D. CostaLPRM/DI/UFES public synchronized void putforks(int i) { state[i] = THINKING; test(left(i), checkstarving); test(right(i), checkstarving); notifyall(); 27 Sistemas Operacionais 2008/1