Threads em Java - Universidade Federal do Espírito...
Transcript of Threads em Java - Universidade Federal do Espírito...
![Page 1: Threads em Java - Universidade Federal do Espírito Santopdcosta/ensino/2008-1-sistemas-operacionais/Slid… · Exemplo de criação de Thread em Java ! % . ( " &/ 0 & public class](https://reader033.fdocument.pub/reader033/viewer/2022042921/5f6bc2a3031e545d4d1e59f8/html5/thumbnails/1.jpg)
Threads em Java(Aula 17)
![Page 2: Threads em Java - Universidade Federal do Espírito Santopdcosta/ensino/2008-1-sistemas-operacionais/Slid… · Exemplo de criação de Thread em Java ! % . ( " &/ 0 & public class](https://reader033.fdocument.pub/reader033/viewer/2022042921/5f6bc2a3031e545d4d1e59f8/html5/thumbnails/2.jpg)
2 Sistemas Operacionais 2008/1Profa. Patrícia D. Costa LPRM/DI/UFES
Java Threads� Difícil de classificar com user thread ou kernel thread� As threads Java são gerenciadas pela JVM.� Threads em Java podem ser criadas das seguintes maneiras:� Fazendo “extend” da classe Thread.� Implementando a interface Runnable.� A JVM só suporta um processo� Criar um novo processo em java implica em criar umanova JVM p/ rodar o novo processo
![Page 3: Threads em Java - Universidade Federal do Espírito Santopdcosta/ensino/2008-1-sistemas-operacionais/Slid… · Exemplo de criação de Thread em Java ! % . ( " &/ 0 & public class](https://reader033.fdocument.pub/reader033/viewer/2022042921/5f6bc2a3031e545d4d1e59f8/html5/thumbnails/3.jpg)
3 Sistemas Operacionais 2008/1Profa. Patrícia D. Costa LPRM/DI/UFES
Java� Componentes:� Especificação da linguagem de programação� API Java� JVM: Máquina Virtual Java� JVM:
![Page 4: Threads em Java - Universidade Federal do Espírito Santopdcosta/ensino/2008-1-sistemas-operacionais/Slid… · Exemplo de criação de Thread em Java ! % . ( " &/ 0 & public class](https://reader033.fdocument.pub/reader033/viewer/2022042921/5f6bc2a3031e545d4d1e59f8/html5/thumbnails/4.jpg)
4 Sistemas Operacionais 2008/1Profa. Patrícia D. Costa LPRM/DI/UFES
JVM� Programas Java compilados são bytecodes independentes de plataforma de execução da JVM� A JVM consiste de:� Carregador de classes (Class loader)� Verificador de classes (Class verifier)� Interpretador runtime (Runtime interpreter)
![Page 5: Threads em Java - Universidade Federal do Espírito Santopdcosta/ensino/2008-1-sistemas-operacionais/Slid… · Exemplo de criação de Thread em Java ! % . ( " &/ 0 & public class](https://reader033.fdocument.pub/reader033/viewer/2022042921/5f6bc2a3031e545d4d1e59f8/html5/thumbnails/5.jpg)
5 Sistemas Operacionais 2008/1Profa. Patrícia D. Costa LPRM/DI/UFES
Java Threads� Toda aplicação Java tem pelo menos uma thread (sem considerar o system thread)� Do ponto de vista do desenvolvedor, o programa começa com uma thread, chamada de main thread. � A main thread cria novas threads.
![Page 6: Threads em Java - Universidade Federal do Espírito Santopdcosta/ensino/2008-1-sistemas-operacionais/Slid… · Exemplo de criação de Thread em Java ! % . ( " &/ 0 & public class](https://reader033.fdocument.pub/reader033/viewer/2022042921/5f6bc2a3031e545d4d1e59f8/html5/thumbnails/6.jpg)
6 Sistemas Operacionais 2008/1Profa. Patrícia D. Costa LPRM/DI/UFES
Java Threads (2)� Cada thread é associada com uma instância da classe Thread.� Duas estratégicas possíveis para criar uma thread:� Instanciando a classe Thread;� Delegando criação/gerência da thread para “executor” (high-level concurrency objects)
![Page 7: Threads em Java - Universidade Federal do Espírito Santopdcosta/ensino/2008-1-sistemas-operacionais/Slid… · Exemplo de criação de Thread em Java ! % . ( " &/ 0 & public class](https://reader033.fdocument.pub/reader033/viewer/2022042921/5f6bc2a3031e545d4d1e59f8/html5/thumbnails/7.jpg)
7 Sistemas Operacionais 2008/1Profa. Patrícia D. Costa LPRM/DI/UFES
Exemplo de criação de Thread em Java� A aplicação que cria instância de Thread deve fornecer o código a ser executado na thread.� Passando um objeto Runnable para o construtor da classe Thread:public class HelloRunnable implements Runnable {
public void run() {
System.out.println("Hello from a thread!");
}
public static void main(String args[]) {
(new Thread(new HelloRunnable())).start();
} }
![Page 8: Threads em Java - Universidade Federal do Espírito Santopdcosta/ensino/2008-1-sistemas-operacionais/Slid… · Exemplo de criação de Thread em Java ! % . ( " &/ 0 & public class](https://reader033.fdocument.pub/reader033/viewer/2022042921/5f6bc2a3031e545d4d1e59f8/html5/thumbnails/8.jpg)
8 Sistemas Operacionais 2008/1Profa. Patrícia D. Costa LPRM/DI/UFES
Exemplo de criação de Thread em Java (2)� Fazendo subclass de Thread (que também implementa Runnable)public class HelloThread extends Thread {
public void run() {
System.out.println("Hello from a thread!");
}
public static void main(String args[]) {
(new HelloThread()).start();
}
}
![Page 9: Threads em Java - Universidade Federal do Espírito Santopdcosta/ensino/2008-1-sistemas-operacionais/Slid… · Exemplo de criação de Thread em Java ! % . ( " &/ 0 & public class](https://reader033.fdocument.pub/reader033/viewer/2022042921/5f6bc2a3031e545d4d1e59f8/html5/thumbnails/9.jpg)
9 Sistemas Operacionais 2008/1Profa. Patrícia D. Costa LPRM/DI/UFES
Principais métodos da Classe Thread� run(): é o método que executa as atividades de uma thread. Quando este método finaliza, a thread também termina.� start(): método que dispara a execução de umathread. Este método chama o método run( ) antes de terminar.� sleep(int x): método que coloca a thread paradormir por x milisegundos.
![Page 10: Threads em Java - Universidade Federal do Espírito Santopdcosta/ensino/2008-1-sistemas-operacionais/Slid… · Exemplo de criação de Thread em Java ! % . ( " &/ 0 & public class](https://reader033.fdocument.pub/reader033/viewer/2022042921/5f6bc2a3031e545d4d1e59f8/html5/thumbnails/10.jpg)
10
10 Sistemas Operacionais 2008/1Profa. Patrícia D. Costa LPRM/DI/UFES
Principais métodos da Classe Thread� 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çãode uma thread.� interrupted( ): método que testa se uma thread está ou não interrompida.
![Page 11: Threads em Java - Universidade Federal do Espírito Santopdcosta/ensino/2008-1-sistemas-operacionais/Slid… · Exemplo de criação de Thread em Java ! % . ( " &/ 0 & public class](https://reader033.fdocument.pub/reader033/viewer/2022042921/5f6bc2a3031e545d4d1e59f8/html5/thumbnails/11.jpg)
11
11 Sistemas Operacionais 2008/1Profa. Patrícia D. Costa LPRM/DI/UFES
Estados da threadnascimento
pronta
executando
esperando dormindo morta bloqueada
start( )
Alocar um processador
wait( )sleep( ) Fim do
Método run( )
E/S
Fim da E/Snotify( )
notifyAll( )
Término do tempo de dormida
run( )
![Page 12: Threads em Java - Universidade Federal do Espírito Santopdcosta/ensino/2008-1-sistemas-operacionais/Slid… · Exemplo de criação de Thread em Java ! % . ( " &/ 0 & public class](https://reader033.fdocument.pub/reader033/viewer/2022042921/5f6bc2a3031e545d4d1e59f8/html5/thumbnails/12.jpg)
12
12 Sistemas Operacionais 2008/1Profa. Patrícia D. Costa LPRM/DI/UFES
Sincronização de Threads em Java� O controle de execução de sessões críticas em Java é garantido por um mecanismo de monitores� Sessão de código (RC) é executada por apenas uma thread em um determinado instante de tempo� Thread que deseja executar a RC, pede permissão para execução; � Se tiver permissão, executa região bloqueando entrada para outras threads � Se não tiver a permissão (outra thread está executando), bloqueia até liberarhttp://java.sun.com/docs/books/tutorial/essential/concurrency/index.html
![Page 13: Threads em Java - Universidade Federal do Espírito Santopdcosta/ensino/2008-1-sistemas-operacionais/Slid… · Exemplo de criação de Thread em Java ! % . ( " &/ 0 & public class](https://reader033.fdocument.pub/reader033/viewer/2022042921/5f6bc2a3031e545d4d1e59f8/html5/thumbnails/13.jpg)
13
13 Sistemas Operacionais 2008/1Profa. Patrícia D. Costa LPRM/DI/UFES
Monitores em Java
Baseada na abordagem deHansen, mas sem garantias de que uma waiting thread entrará no monitor! Portanto, um signal é apenas uma indicação (para os processos em espera) de que o estado desejado existe. Isto significa que os processos que estão esperando devem sempre checar a condição antes começar a executar no monitor.
![Page 14: Threads em Java - Universidade Federal do Espírito Santopdcosta/ensino/2008-1-sistemas-operacionais/Slid… · Exemplo de criação de Thread em Java ! % . ( " &/ 0 & public class](https://reader033.fdocument.pub/reader033/viewer/2022042921/5f6bc2a3031e545d4d1e59f8/html5/thumbnails/14.jpg)
14
14 Sistemas Operacionais 2008/1Profa. Patrícia D. Costa LPRM/DI/UFES
Sincronização de Threads em Java (cont.)� Todos os objetos Java são potencialmente monitores� Objetos e classes possuem um lock intrínseco� Para fazer chamada a algum método de um objeto compartilhado (monitor), deve-se obter o lock� O mesmo para métodos de classe (static)� A palavra synchronized é usada para se obter o lock de um objeto monitor (ou classe) em java
![Page 15: Threads em Java - Universidade Federal do Espírito Santopdcosta/ensino/2008-1-sistemas-operacionais/Slid… · Exemplo de criação de Thread em Java ! % . ( " &/ 0 & public class](https://reader033.fdocument.pub/reader033/viewer/2022042921/5f6bc2a3031e545d4d1e59f8/html5/thumbnails/15.jpg)
15
15 Sistemas Operacionais 2008/1Profa. Patrícia D. Costa LPRM/DI/UFES
Granularidade de Sincronização� Classe� Objeto� Bloco de código
![Page 16: Threads em Java - Universidade Federal do Espírito Santopdcosta/ensino/2008-1-sistemas-operacionais/Slid… · Exemplo de criação de Thread em Java ! % . ( " &/ 0 & public class](https://reader033.fdocument.pub/reader033/viewer/2022042921/5f6bc2a3031e545d4d1e59f8/html5/thumbnails/16.jpg)
16
16 Sistemas Operacionais 2008/1Profa. Patrícia D. Costa LPRM/DI/UFES
Sincronização de Classe� Garante que apenas uma thread vai executar um (synchronized) método no escopo de uma classe (static method)class Buffer {
private static Pilha p;
initialize { p = new Pilha(); }
public Buffer(){}
syncronized static public void Insere( Object _o ) {
p.Push( _o );
}
syncronized static public Object Retira() {
return p.Pop();
}
}
![Page 17: Threads em Java - Universidade Federal do Espírito Santopdcosta/ensino/2008-1-sistemas-operacionais/Slid… · Exemplo de criação de Thread em Java ! % . ( " &/ 0 & public class](https://reader033.fdocument.pub/reader033/viewer/2022042921/5f6bc2a3031e545d4d1e59f8/html5/thumbnails/17.jpg)
17
17 Sistemas Operacionais 2008/1Profa. Patrícia D. Costa LPRM/DI/UFES
Sincronização de Objeto� Garante que apenas uma thread vai executar um (synchronized) método no escopo de um objetoclass Buffer {
private Pilha p;
public Buffer(){
p = new Pilha();
}
syncronized public void Insere( Object _o ) {
p.Push( _o );
}
syncronized public Object Retira() {
return p.Pop();
}
}
![Page 18: Threads em Java - Universidade Federal do Espírito Santopdcosta/ensino/2008-1-sistemas-operacionais/Slid… · Exemplo de criação de Thread em Java ! % . ( " &/ 0 & public class](https://reader033.fdocument.pub/reader033/viewer/2022042921/5f6bc2a3031e545d4d1e59f8/html5/thumbnails/18.jpg)
18
18 Sistemas Operacionais 2008/1Profa. Patrícia D. Costa LPRM/DI/UFES
Sincronização de Bloco� Garante que apenas uma thread vai executar o conjunto de instruções definidas dentro do bloco� É usado um objeto auxiliar (e.x. this) para garantir exclusão mútuaclass Buffer {
private Pilha p;public Buffer(){
p = new Pilha();}public void Insere( Object _o ) {
syncronized(this) { p.Push( _o ); }
}
syncronized public Object Retira() {
Object aux;syncronized(this) { aux = p.Pop(); }return aux;
}}
![Page 19: Threads em Java - Universidade Federal do Espírito Santopdcosta/ensino/2008-1-sistemas-operacionais/Slid… · Exemplo de criação de Thread em Java ! % . ( " &/ 0 & public class](https://reader033.fdocument.pub/reader033/viewer/2022042921/5f6bc2a3031e545d4d1e59f8/html5/thumbnails/19.jpg)
19
19 Sistemas Operacionais 2008/1Profa. Patrícia D. Costa LPRM/DI/UFES
Sincronização de Bloco (métodos independentes)� São usados objetos auxiliares distintos para evitar exclusão mútua (interleave) entre métodospublic class MsLunch{ private long c1 = 0;
private long c2 = 0; private Object lock1 = new Object(); private Object lock2 = new Object(); public void inc1() {
synchronized(lock1){ c1++;
} } public void inc2() {
synchronized(lock2){ c2++;
} } }
![Page 20: Threads em Java - Universidade Federal do Espírito Santopdcosta/ensino/2008-1-sistemas-operacionais/Slid… · Exemplo de criação de Thread em Java ! % . ( " &/ 0 & public class](https://reader033.fdocument.pub/reader033/viewer/2022042921/5f6bc2a3031e545d4d1e59f8/html5/thumbnails/20.jpg)
20
20 Sistemas Operacionais 2008/1Profa. Patrícia D. Costa LPRM/DI/UFES
Sincronização Reentrante� Uma thread não pode obter um lock que está com outra thread� Mas uma thread pode obter um lock que ela já possui� Permite um método (synchronized) chamar outro método também synchronized � Evita que uma thread cause o bloqueio de si mesma
![Page 21: Threads em Java - Universidade Federal do Espírito Santopdcosta/ensino/2008-1-sistemas-operacionais/Slid… · Exemplo de criação de Thread em Java ! % . ( " &/ 0 & public class](https://reader033.fdocument.pub/reader033/viewer/2022042921/5f6bc2a3031e545d4d1e59f8/html5/thumbnails/21.jpg)
21
21 Sistemas Operacionais 2008/1Profa. Patrícia D. Costa LPRM/DI/UFES
Guarded Blocks� Usados para coordenar as ações das threads� Um “guarded block” começa perguntando (polling) se uma condição é verdadeira// joy é uma variável compartilhada
public synchronized guardedJoy(){
while(!joy){
try {
wait(); /* bloqueia a thread até algum evento ser notificado. Note que pode ser qualquer evento, nãonecessariamente o que esperamos */
} catch (InterruptedException e) {}
}
System.out.println("Joy and efficiency have been achieved!");
}
![Page 22: Threads em Java - Universidade Federal do Espírito Santopdcosta/ensino/2008-1-sistemas-operacionais/Slid… · Exemplo de criação de Thread em Java ! % . ( " &/ 0 & public class](https://reader033.fdocument.pub/reader033/viewer/2022042921/5f6bc2a3031e545d4d1e59f8/html5/thumbnails/22.jpg)
22
22 Sistemas Operacionais 2008/1Profa. Patrícia D. Costa LPRM/DI/UFES
Guarded Blocks (cont)� Sempre use o “wait” dentro de um loop que testa se a condição esperada foi satisfeita (Abordagem de Hansen). Não assuma que a interrupção foi para a condição específica que estávamos esperando� Mesmo que o evento tenha sido o que estávamos esperando, pode ser que a condição não seja mais a mesma quando a thread ganhar permissão de executar
![Page 23: Threads em Java - Universidade Federal do Espírito Santopdcosta/ensino/2008-1-sistemas-operacionais/Slid… · Exemplo de criação de Thread em Java ! % . ( " &/ 0 & public class](https://reader033.fdocument.pub/reader033/viewer/2022042921/5f6bc2a3031e545d4d1e59f8/html5/thumbnails/23.jpg)
23
23 Sistemas Operacionais 2008/1Profa. Patrícia D. Costa LPRM/DI/UFES
Wait� Quando uma thread executa o.wait, ela precisa ter o lock intrínseco do objeto o� Executar o wait dentro de um método synchronized é uma maneira simples de obter o lock� Quando uma thread chama o wait, a thread libera o lock e suspende a execução
![Page 24: Threads em Java - Universidade Federal do Espírito Santopdcosta/ensino/2008-1-sistemas-operacionais/Slid… · Exemplo de criação de Thread em Java ! % . ( " &/ 0 & public class](https://reader033.fdocument.pub/reader033/viewer/2022042921/5f6bc2a3031e545d4d1e59f8/html5/thumbnails/24.jpg)
24
24 Sistemas Operacionais 2008/1Profa. Patrícia D. Costa LPRM/DI/UFES
NotifyAll (cont.)� Uma outra thread que obtenha o lock vai chamar o.notifyAll, que informa a todas as threads que estejam esperando por aquele lock que algo importante aconteceupublic synchronized notifyJoy(){
joy = true;
notifyAll();
}
![Page 25: Threads em Java - Universidade Federal do Espírito Santopdcosta/ensino/2008-1-sistemas-operacionais/Slid… · Exemplo de criação de Thread em Java ! % . ( " &/ 0 & public class](https://reader033.fdocument.pub/reader033/viewer/2022042921/5f6bc2a3031e545d4d1e59f8/html5/thumbnails/25.jpg)
25
25 Sistemas Operacionais 2008/1Profa. Patrícia D. Costa LPRM/DI/UFES
Exemplo dos Filósofosclass 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;
public DiningServer(int numPhils, boolean checkStarvi ng) {
this.numPhils = numPhils;
this.checkStarving = checkStarving;
state = new int[numPhils];
for (int i = 0; i < numPhils; i++) state[i] = THINKI NG;
System.out.println("DiningServer: checkStarving="
+ checkStarving);
}
private final int left(int i) { return (numPhils + i - 1) % numPhils; }
private final int right(int i) { return (i + 1) % num Phils; }
![Page 26: Threads em Java - Universidade Federal do Espírito Santopdcosta/ensino/2008-1-sistemas-operacionais/Slid… · Exemplo de criação de Thread em Java ! % . ( " &/ 0 & public class](https://reader033.fdocument.pub/reader033/viewer/2022042921/5f6bc2a3031e545d4d1e59f8/html5/thumbnails/26.jpg)
26
26 Sistemas Operacionais 2008/1Profa. Patrícia D. Costa LPRM/DI/UFES
Exemplo dos Filósofos (cont.)private void seeIfStarving(int k) {
if (state[k] == HUNGRY && state[left(k)] != STARVIN G &&
state[right(k)] != STARVING) {
state[k] = STARVING;
System.out.println("philosopher " + k + " is STARVIN G");
}
}
private void test(int k, boolean checkStarving) {
if (state[left(k)] != EATING && state[left(k)] != S TARVING &&
(state[k] == HUNGRY || state[k] == STARVING) &&
state[right(k)] != STARVING && state[right(k)] != E ATING)
state[k] = EATING;
else if (checkStarving)
seeIfStarving(k); // simplistic naive check for sta rvation
}
![Page 27: Threads em Java - Universidade Federal do Espírito Santopdcosta/ensino/2008-1-sistemas-operacionais/Slid… · Exemplo de criação de Thread em Java ! % . ( " &/ 0 & public class](https://reader033.fdocument.pub/reader033/viewer/2022042921/5f6bc2a3031e545d4d1e59f8/html5/thumbnails/27.jpg)
27
27 Sistemas Operacionais 2008/1Profa. Patrícia D. Costa LPRM/DI/UFES
Exemplospublic synchronized void takeForks(int i) {
state[i] = HUNGRY;
test(i, false);
while (state[i] != EATING)
try {wait();} catch (InterruptedException e) {}
}
public synchronized void putForks(int i) {
state[i] = THINKING;
test(left(i), checkStarving);
test(right(i), checkStarving);
notifyAll();
}
}