Threads e Pipes em Java

Aplicações Distribuídas
Licenciatura em Engenharia Informática
3º Ano – 5º Semestre Ano lectivo 2010-2011

Alexandre Fonte

Material de Apoio a AD, ESTCB Edição 2010-2011

1

Resumo
 

Pipes em Java
           

Introdução aos Threads em Java Comunicação entre Tarefas (Threads). Classes Java de Suporte Passagem de arrays de bytes Passagem de fluxos (Streams) de dados Passagem de Objectos

Alexandre Fonte

Material de Apoio a AD, ESTCB Edição 2010-2011

Programa mono-tarefa (single-thread)
class ABC { ….
public void main(..) {
System.out.println(" Este thread está em execução... ");

Thread

}

}
3 Alexandre Fonte Material de Apoio a AD, ESTCB Edição 2010-2011

Execução de código concorrente

Thread= Pedaço de código que é Thread lançado (pelo processo servidor) principal/mestre e executado concorrentemente com outras threads.
start start start

Threads Escravos

Thread A

Thread B

Thread C

Os Threads podem trocar dados/resultados
Alexandre Fonte Material de Apoio a AD, ESTCB Edição 2010-2011

O que são Threads?
 

 

Pedaço de código executado concorrencialmente com outras threads Cada thread é uma sequência de instruções ordenada estaticamente

Alexandre Fonte

Material de Apoio a AD, ESTCB Edição 2010-2011

5

Como criar Threads

Alexandre Fonte

Material de Apoio a AD, ESTCB Edição 2010-2011

6

Como criar Threads
 

Há duas estratégias
   

Criar uma classe que a classe java.lang.Thread Criar uma clase que implementa a interface java.lang.Runnable O objeto é um Thread, e sobrepõe o comportamentopadrão associado à classe Thread O objeto, que define o comportamento da execução, é passado para um Thread que o executa Sobreponha o método run() que é o "main()" do Thread O run() deve conter um loop que irá rodar pelo tempo devida do thread. Quando o run(), terminar, o thread morre.

 

Herdar da classe Thread
 

 

Implementar a interface Runnable
 

 

Em ambos os casos
   

Alexandre Fonte

Material de Apoio a AD, ESTCB Edição 2010-2011

7

Implementação de Tarefas/1º método Extensão da classe Thread
 

Threads são implementados como objectos que contém um método chamado run()
class MyThread extends Thread { public void run() { // thread body of execution } }

 

Como usar o Thread
   

 

Criar um thread: MyThread thr1 = new MyThread(); Começar a execução dos threads: thr1.start(); Criar e Executar ao mesmo tempo: new MyThread().start();
Material de Apoio a AD, ESTCB Edição 2010-2011

8

Alexandre Fonte

Exemplo
class MyThread extends Thread { // O thread public void run() { System.out.println(" Este thread está em execução ... "); } } // fim da classe MyThread class ThreadEx1 { // programa que utiliza o thread public static void main(String [] args ) { MyThread t = new MyThread(); MyThread t2 = new MyThread(); t2.start(); t.start(); } // fim do main() } // fim da class ThreadEx1

9

Alexandre Fonte

Material de Apoio a AD, ESTCB Edição 2010-2011

Implementação de Tarefas/2º método Implementação da Runnable interface
class MyThread extends ABC implements Runnable { ..... public void run() { // thread body of execution } }   Criar um Objecto: MyThread myObject = new MyThread();   Criar o objecto Thread: Thread thr1 = new Thread( myObject );   Executar a thread: thr1.start();
Alexandre Fonte Material de Apoio a AD, ESTCB Edição 2010-2011 10

Exemplo
class MyThread implements Runnable { public void run() { System.out.println(" Este thread está em execução ... "); } } // fim da classe MyThread class ThreadEx2 { public static void main(String [] args ) { Thread t = new Thread(new MyThread()); // Devido à implementação da interface Runnable // Chamo o método start(), que chamará o método run (). t.start(); } // fim do main() } // fim da classe ThreadEx2

Alexandre Fonte

Material de Apoio a AD, ESTCB Edição 2010-2011

11

Ciclo de vida de uma Thread
novo
start() wait() sleep() suspend(), …

runnable
stop() notify() resume(), …

non-runnable

dead
Alexandre Fonte Material de Apoio a AD, ESTCB Edição 2010-2011 12

Controlo das Java Threads
 

Métodos fornecidos pela classe Thread:
 

 

 

start() e stop(): arrancam e terminam a execução da thread suspend() e resume(): suspende e retoma a execução da thread sleep(delay): adormece a thread durante alguns milisegundos

Alexandre Fonte

Material de Apoio a AD, ESTCB Edição 2010-2011

13

Exemplo de Programa com 3 Threads
class A extends Thread { public void run() { for(int i=1;i<=5;i++) { System.out.println("\t From ThreadA: i= "+i); } System.out.println("Exit from A"); } } class B extends Thread { public void run() { for(int j=1;j<=5;j++) { System.out.println("\t From ThreadB: j= "+j); } System.out.println("Exit from B"); } } Alexandre Fonte Material de Apoio a AD, ESTCB Edição 2010-2011 14

Exemplo de Programa com 3 Threads
class C extends Thread { public void run() { for(int k=1;k<=5;k++) { System.out.println("\t From ThreadC: k= "+k); } System.out.println("Exit from C"); } } class ThreadTest { public static void main(String args[]) { new A().start(); new B().start(); new C().start(); } } Alexandre Fonte Material de Apoio a AD, ESTCB Edição 2010-2011

15

Execução 1
[raj@mundroo] threads [1:76] java ThreadTest From ThreadA: i= 1 From ThreadA: i= 2 From ThreadA: i= 3 From ThreadA: i= 4 From ThreadA: i= 5 Exit from A From ThreadC: k= 1 From ThreadC: k= 2 From ThreadC: k= 3 From ThreadC: k= 4 From ThreadC: k= 5 Exit from C From ThreadB: j= 1 From ThreadB: j= 2 From ThreadB: j= 3 From ThreadB: j= 4 From ThreadB: j= 5 Exit from B

Alexandre Fonte

Material de Apoio a AD, ESTCB Edição 2010-2011

16

Execução 2
[raj@mundroo] threads [1:77] java ThreadTest From ThreadA: i= 1 From ThreadA: i= 2 From ThreadA: i= 3 From ThreadA: i= 4 From ThreadA: i= 5 From ThreadC: k= 1 From ThreadC: k= 2 From ThreadC: k= 3 From ThreadC: k= 4 From ThreadC: k= 5 Exit from C From ThreadB: j= 1 From ThreadB: j= 2 From ThreadB: j= 3 From ThreadB: j= 4 From ThreadB: j= 5 Exit from B Exit from A

Alexandre Fonte

Material de Apoio a AD, ESTCB Edição 2010-2011

17

Acesso a Recursos Partilhados
 

É preciso coordenar as aplicações que acedem a recursos partilhados.
 

 

 

Impressora (2 trabalhos não podem ser impressos em simultâneo) Várias operações bancárias em simultâneo sobre a mesma conta Das seguintes operações quais podem ser executadas em simultâneo sobre a mesma conta?
     

Depositar Levantar Consultar

Alexandre Fonte

Material de Apoio a AD, ESTCB Edição 2010-2011

18

Banca On-line: servindo vários clientes e operações
PC client

Internet Bank Server
Local Area Network

Bank Database
Alexandre Fonte

PDA
19

Material de Apoio a AD, ESTCB Edição 2010-2011

Acesso a Recursos partilhados
 

 

Se uma thread tenta ler dados, enquanto outra tenta actualizar os dados, pode conduzir a um estado inconsistência dos dados. Solução: Previne-se simplesmente sincronizando o acesso aos dados.
 

Uso métodos Synchronized :
public synchronized void update() {


}
 

Pedaços Synchronized :
void updated() { synchronized (this) { //Pedaço synchronized } }

Alexandre Fonte

Material de Apoio a AD, ESTCB Edição 2010-2011

20

Conta Partilhada por 3 threads
class InternetBankingSystem { public static void main(String [] args ) { Account accountObject = new Account ();
Thread t1 = new Thread(new MyThread(accountObject)); Thread t2 = new Thread(new YourThread(accountObject)); Thread t3 = new Thread(new HerThread(accountObject));

t1.start(); t2.start(); t3.start(); // DO some other operation } // end main() }
Alexandre Fonte Material de Apoio a AD, ESTCB Edição 2010-2011 21

Conta Partilhada por 3 threads
class MyThread implements Runnable { Account account; public MyThread (Account s) { account = s;} public void run() { account.deposit(); } } // end class MyThread class YourThread implements Runnable { Account account; public YourThread (Account s) { account = s;} public void run() { account.withdraw(); } } // end class YourThread class HerThread implements Runnable { Account account; public HerThread (Account s) { account = s; } public void run() {account.enquire(); } } // end class HerThread

account (Objecto partilhado)

Alexandre Fonte

Material de Apoio a AD, ESTCB Edição 2010-2011

22

Métodos sincronizados
class Account { // the 'monitor' int balance;
// if 'synchronized' is removed, the outcome is unpredictable public synchronized void deposit( ) { // METHOD BODY : balance += deposit_amount; } public synchronized void withdraw( ) { // METHOD BODY: balance -= deposit_amount; } public synchronized void enquire( ) { // METHOD BODY: display balance. }

}

Alexandre Fonte

Material de Apoio a AD, ESTCB Edição 2010-2011

23

Libertação dos trincos
   

 

Todo o objecto Java possui um trinco/lock associado Os métodos syncronized permitem que uma thread adquira o trinco para poder manipular o objecto (e.g., accountObject) Os métodos wait() e notify() da class Object extendem esta funcionalidade:
   

wait(): liberta o trinco e adormece. notify(), notifyall(): notifica outras threads que libertou o trinco do objecto (acorda apenas a 1ª thread ou todas as threads)

Alexandre Fonte

Material de Apoio a AD, ESTCB Edição 2010-2011

24

Risco de Deadlock
 

 

Quando métodos sincronizados chamam outros métodos sincronizados há risco de deadlock Exemplo:
 

 

O Thread A espera a liberação do acesso a um objeto que está com Thread B O Thread B aguarda que alguém (A, por exemplo) faça uma alteração no objeto para que possa liberá-lo (mas ninguém tem acesso a ele, pois B o monopoliza! Evitar que métodos sincronizados chamem outros métodos sincronizados Se isto não for possível, controlar a liberação e retorno dos acessos

 

Solução básica
 

 

Alexandre Fonte

Material de Apoio a AD, ESTCB Edição 2010-2011

25

Prioridade da thread
 

 

Em Java, a cada thread é atribuída uma prioridade, cujo valor afecta a ordem é que é escalonada a sua execução. Por omissão, as threads possuem a mesma prioridade (NORM_PRIORITY) e são servidas de acordo com uma política FCFS.
 

Java permite que os utilzadores alterem o valor da prioridade das threads:
 

ThreadName.setPriority(intNumber)
     

MIN_PRIORITY = 1 NORM_PRIORITY=5 MAX_PRIORITY=10
Material de Apoio a AD, ESTCB Edição 2010-2011 26

Alexandre Fonte

Exemplo: thread com prioridade
class A extends Thread
{ public void run() { System.out.println("Thread A started"); for(int i=1;i<=4;i++) { System.out.println("\t From ThreadA: i= "+i); } System.out.println("Exit from A"); } } class B extends Thread { public void run() { System.out.println("Thread B started"); for(int j=1;j<=4;j++) { System.out.println("\t From ThreadB: j= "+j); } System.out.println("Exit from B"); } } Alexandre Fonte Material de Apoio a AD, ESTCB Edição 2010-2011

27

Exemplo: thread com prioridade
class C extends Thread { public void run() { System.out.println("Thread C started"); for(int k=1;k<=4;k++) { System.out.println("\t From ThreadC: k= "+k); } System.out.println("Exit from C"); } } class ThreadPriority { public static void main(String args[]) { A threadA=new A(); B threadB=new B(); C threadC=new C(); threadC.setPriority(Thread.MAX_PRIORITY); threadB.setPriority(threadA.getPriority()+1); threadA.setPriority(Thread.MIN_PRIORITY); System.out.println("Started Thread A"); threadA.start(); System.out.println("Started Thread B"); threadB.start(); System.out.println("Started Thread C"); threadC.start(); System.out.println("End of main thread"); } }

Alexandre Fonte

Material de Apoio a AD, ESTCB Edição 2010-2011

28

Comunicação entre Threads
Espaço de endereçamento do Sistema Operativo

Espaço de endereçamento Privado

Espaço de endereçamento Privado

Pipe

Thread 1

Thread 2

Alexandre Fonte

Material de Apoio a AD, ESTCB Edição 2010-2011

Pipes em Java
 

Package java.io
 

 
 

Fáceis de usar. Oferecem uma abstracção semelhante à escrita/leitura de ficheiros Classes Essenciais:

 

 

Criação de Pipes e passagem de arrays de bytes   PipedInputStream   PipedOutputStream Passagem de Fluxos de dados   DataInputStream   DataOutputStream Passagem de Objectos   ObjectInputStream   ObjectOutputStream
Alexandre Fonte Material de Apoio a AD, ESTCB Edição 2010-2011

Pipes em Java: Criação dos Pipes
   

Classes PipedInputStream e PipedOutputStream Métodos Construtores
   

is = new PipedInputStream() os = new PipedOutputStream(is)

Alexandre Fonte

Material de Apoio a AD, ESTCB Edição 2010-2011

Pipes em Java: Passagem de Bytes
 

Métodos (forma nativa)
   

is.read(vectorbytes) os.write(outrovectorbytes)

Alexandre Fonte

Material de Apoio a AD, ESTCB Edição 2010-2011

Pipes em Java: Fluxos de Dados
 

Uso de Pipes com fluxos (streams) de dados   Criação do fluxo:
   

in = new java.io.DataInputStream(is); out = new java.io.DataOutputStream(os);

 

Envio e recepção de dados:
   

<tipo> var = in.read out.write<tipo>(var);
   

onde <tipo> = Int, Long, Float, Double, etc, E.g., out.writeInt(10); //Escreve no Pipe o Inteiro 10.

Alexandre Fonte

Material de Apoio a AD, ESTCB Edição 2010-2011

Pipes em Java: Fluxos de Objectos
 

Uso de Pipes com fluxos (streams) de objectos   Criação do fluxo:
   

in = new java.io.ObjectInputStream(is); out = new java.io.ObjectOutputStream(os);

 

Envio e recepção de objectos:
   

<classe> obj = (<classe>)in.readObject(); out.writeObject(obj);
 

onde <classe> = classe do objecto lido/enviado.

Alexandre Fonte

Material de Apoio a AD, ESTCB Edição 2010-2011

Referências Bibliográficas
 

Partes destes slides são baseados nos slides disponíveis em http://www.buyya.com/cv.html.

Alexandre Fonte

Material de Apoio a AD, ESTCB Edição 2010-2011

35

Sign up to vote on this title
UsefulNot useful