You are on page 1of 35

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 Thread A Thread B Thread C


Escravos

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
  Herdar da classe Thread
  O objeto é um Thread, e sobrepõe o comportamentopadrão associado
à classe Thread
  Implementar a interface Runnable
  O objeto, que define o comportamento da execução, é passado para
um Thread que o executa
  Em ambos os casos
  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.

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();

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


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
wait()
start() sleep()
suspend(),

runnable non-runnable

notify()
stop()
resume(),

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 PDA
Alexandre Fonte Material de Apoio a AD, ESTCB Edição 2010-2011
19
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; account
public YourThread (Account s) { account = s;}
public void run() { account.withdraw(); } (Objecto
} // end class YourThread partilhado)
class HerThread implements Runnable {
Account account;
public HerThread (Account s) { account = s; }
public void run() {account.enquire(); }
} // end class HerThread

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!
  Solução básica
  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

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

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


26
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 Espaço de
Privado 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

You might also like