Você está na página 1de 46

Linguagem de Programao III

Programao Concorrente na Linguagem Java


Prof. Danilo Ricardo Barbosa de Arajo
araujo.danilo.r.b@gmail.com

Roteiro
Introduo sobre Programao Concorrente Threads Prioridades de threads e Agendamento Ciclo de vida de uma thread Interface Runnable Sincronizao de threads Daemon Threads Construes de alto nvel para tratamento de concorrncia

Linguagem de Programao III Programao Concorrente em Java Danilo Ricardo Barbosa de Arajo

Introduo
Definio de Programao Concorrente:
Paradigma de linguagem de programao que faz uso da execuo concorrente (simultnea) de vrias tarefas computacionais Tipos de implementao:
Vrios programas Vrias threads de um mesmo programa

Execuo em um nico processador, vrios processadores, ou em vrias estaes da rede

(multithreading = tipo de multitasking implementada usando threads)


Linguagem de Programao III Programao Concorrente em Java Danilo Ricardo Barbosa de Arajo

Introduo
Motivao :
Busca por melhoria de desempenho Escrever programas reais em domnios inerentemente concorrentes (simulaes) Desenvolvimento de novas arquiteturas (processadores com vrios ncleos)

Linguagem de Programao III Programao Concorrente em Java Danilo Ricardo Barbosa de Arajo

Introduo
Programas x Processos:
Um processo a execuo de um programa

Programas Seqenciais x Programas Concorrentes


Programa Seqencial: as mudanas de estado entre processos ocorrem em uma ordem que determinada pelas estruturas de controle do programa Programa Concorrente: no h uma ordem prdeterminada para mudanas de estados entre processos

Linguagem de Programao III Programao Concorrente em Java Danilo Ricardo Barbosa de Arajo

Introduo
Programas x Processos:
Um processo a execuo de um programa

Programas Seqenciais x Programas Concorrentes


Programa Seqencial: as mudanas de estado entre processos ocorrem em uma ordem que determinada pelas estruturas de controle do programa Programa Concorrente: no h uma ordem prdeterminada para mudanas de estados entre processos

Linguagem de Programao III Programao Concorrente em Java Danilo Ricardo Barbosa de Arajo

Introduo
Problemas com concorrncia:
Programas no-determinsticos Programas dependente de velocidade (condies de corrida) Deadlock Starvation

Linguagem de Programao III Programao Concorrente em Java Danilo Ricardo Barbosa de Arajo

No-determinismo
Programas seqncias (sem erros) so determinsticos Determinsticos: vrias execues obtm a mesma sada No-determinsticos: no podemos predizer qual a seqncia de passos que ocorrer Programas difceis de testar

Linguagem de Programao III Programao Concorrente em Java Danilo Ricardo Barbosa de Arajo

No-determinismo

Linguagem de Programao III Programao Concorrente em Java Danilo Ricardo Barbosa de Arajo

No-determinismo
Resultado da Execuo:
p1: 0; p1: 1; p1: 2; p1: 3; p1: 4; p1: 5; p1: 6; p1: 7; p1: 8; p1: 9; p1: 10; p1: 11; p1: 12; p1: 13; p1: 14; p1: 15; p1: 16; p2: 0; p2: 1; p2: 2; p2: 3; p2: 4; p2: 5; p2: 6; p2: 7; p2: 8; p2: 9; p2: 10; p2: 11; p2: 12; p2: 13; p2: 14; p2: 15; p2: 16; p2: 17; p2: 18;

Linguagem de Programao III Programao Concorrente em Java Danilo Ricardo Barbosa de Arajo

No-determinismo

Linguagem de Programao III Programao Concorrente em Java Danilo Ricardo Barbosa de Arajo

No-determinismo
Resultado da Execuo (uma das possibilidades):
P2: 0; P2: 1; P2: 2; P2: 3; P2: 4; P1: 0; P1: 1; P1: 2; P1: 3; P1: 4; P1: 5; P1: 6; P1: 7; P1: 8; P1: 9; P1: 10; P1: 11; P1: 12; P1: 13; P1: 14; P1: 15; P1: 16; P2: 5; P2: 6; P2: 7; P2: 8; P2: 9; P2: 10; P2: 11; P2: 12; P2: 13; P2: 14; P2: 15; P2: 16; P2: 17; P2: 18;

Linguagem de Programao III Programao Concorrente em Java Danilo Ricardo Barbosa de Arajo

Condies de corrida
Programas seqenciais so independentes de velocidade (velocidade relativa entre os processos) Programas concorrentes so dependentes de velocidade Considere dois programas alterando o valor de uma varivel compartilhada...

Linguagem de Programao III Programao Concorrente em Java Danilo Ricardo Barbosa de Arajo

Condies de corrida

Linguagem de Programao III Programao Concorrente em Java Danilo Ricardo Barbosa de Arajo

Condies de corrida
Resultado da Execuo (uma das possibilidades):
Fim da execuo de 2. n = 1 Fim da execuo de 1. n = 2

Resultado removendo as linhas 9, 10:


Fim da execuo de 1. n = 0 Fim da execuo de 2. n = 1 ou Fim da execuo de 2. n = 2 Fim da execuo de 1. n = 2 ou Fim da execuo de 2. n = 1 Fim da execuo de 1. n = 2

Linguagem de Programao III Programao Concorrente em Java Danilo Ricardo Barbosa de Arajo

Deadlock

processos esperando mutuamente para avanar (impasse)


Linguagem de Programao III Programao Concorrente em Java Danilo Ricardo Barbosa de Arajo

Deadlock
Situao em que dois ou mais processos no progridem na execuo pelo fato de estarem esperando mutuamente pela liberao de recursos Mecanismos para evitar:
Ignorar: se acontecer reinicia o sistema Matar os processos envolvidos Evitar as condies propcias para deadlock (evitar aquisio incremental ou espera circular) Limitar o tempo mximo de alocao de recursos

Linguagem de Programao III Programao Concorrente em Java Danilo Ricardo Barbosa de Arajo

Starvation
Todos os processos devem ter o seu progresso garantido mesmo que seja por um tempo finito Pr-condies: sistema livre de deadlock e com escalonamento justo O termo starvation usado quando um processo impedido de executar devido a um escalonamento injusto

Starvation = Inanio (morrer de fome)


Linguagem de Programao III Programao Concorrente em Java Danilo Ricardo Barbosa de Arajo

Threads
Um processo convencional (peso pesado) a execuo de um programa:
espao de endereamento prprio alocao em memria principal tempo compartilhado de uso da CPU

A criao de um processo custosa Toca de contexto entre processos leva muito tempo

Linguagem de Programao III Programao Concorrente em Java Danilo Ricardo Barbosa de Arajo

Threads
Thread uma linha de execuo de um programa, mas de peso leve
Compartilha o mesmo espao de endereamento e demais recursos de um processo pai Criao e troca de execuo entre threads so mais rpidas

processo
thread 1 thread 2
Linguagem de Programao III Programao Concorrente em Java Danilo Ricardo Barbosa de Arajo

Threads
Nosso estudo de concorrncia ser concentrado em programas multithreading!
possvel criar tambm vrios processos usando a linguagem Java! Consulte a classe java.lang.ProcessBuilder

Em Java possvel usar o conceito de multithreading de duas formas bsicas:


Controlando diretamente threads usando a classe java.lang.Thread Abstraindo o gerenciamento de baixo nvel com o uso de um Executor
Linguagem de Programao III Programao Concorrente em Java Danilo Ricardo Barbosa de Arajo

Threads
Panorama geral da classe java.lang.Thread
Construtores:
public Thread(String threadName) public Thread()

Mtodos bsicos:
Mtodo run(): contm o cdigo de execuo da thread Mtodo start(): dispara a execuo (chama o run)

Linguagem de Programao III Programao Concorrente em Java Danilo Ricardo Barbosa de Arajo

Threads
define que ProgramaConcorrente uma Thread

cdigo para execuo da thread

Comea a execuo de uma thread Linguagem de Programao III Programao Concorrente em Java chama o mtodo run() de p1 Danilo Ricardo Barbosa de Arajo

Prioridades de Threads
Cada thread tem uma prioridade:
A prioridade um inteiro entre 1 e 10 Uma thread de alta prioridade tem preferncia sobre uma thread de baixa prioridade A prioridade padro 5 A prioridade herdada da thread pai

Escalonador ou agendador (scheduler): elemento da arquitetura multithreading que determina qual thread deve executar em um dado momento
Usa as prioridades para definir qual thread ir executar Atribui uma fatia de tempo mximo de execuo para cada thread
Linguagem de Programao III Programao Concorrente em Java Danilo Ricardo Barbosa de Arajo

Prioridades de Threads
Mtodos:
int getPriority(): retorna a prioridade da thread void setPriority(int priority): altera a prioridade da thread

Constantes da classe Thread:


Thread.MIN_PRIORITY: prioridade mnima (valor 1) Thread.MAX_PRIORITY : prioridade mxima (valor 10) Thread.NORM_PRIORITY : prioridade padro (valor 5)

Linguagem de Programao III Programao Concorrente em Java Danilo Ricardo Barbosa de Arajo

Prioridades de Threads

o que acontece quando a thread que Linguagem de Programao III Programao Concorrente em Java inicia tem prioridade menor? Danilo Ricardo Barbosa de Arajo

Prioridades de Threads
Resultado da Execuo:
P2: 0; P2: 1; P2: 2; P2: 3; P2: 4; P2: 5; P2: 6; P2: 7; P2: 8; P2: 9; P2: 10; P2: 11; P2: 12; P2: 13; P2: 14; P2: 15; P2: 16; P2: 17; P2: 18; P1: 0; P1: 1; P1: 2; P1: 3; P1: 4; P1: 5; P1: 6; P1: 7; P1: 8; P1: 9; P1: 10; P1: 11; P1: 12; P1: 13; P1: 14; P1: 15; P1: 16;

Linguagem de Programao III Programao Concorrente em Java Danilo Ricardo Barbosa de Arajo

Ciclo de Vida de Threads


O que ocorre com um objeto thread desde a sua criao at o trmino da execuo? O ciclo de vida da thread especifica os estados e mudanas de estado durante o tempo de vida do objeto Ajuda a entender o que est acontecendo:
Quando chamados o start() a thread comea a executar? Quando a execuo do run() termina o que acontece se chamamos o start() de novo ou se chamados o run() diretamente?
Linguagem de Programao III Programao Concorrente em Java Danilo Ricardo Barbosa de Arajo

Ciclo de Vida de Threads


Quando chamamos o mtodos start() as threads no executam imediatamente!
Ocorre uma mudana de estado do objeto de instanciado para pronto Aguarda o escalonador eleger a thread para execuo

O que acontece quando a execuo termina?


Aps finalizar a execuo do mtodo run() a thread considerada morta O que acontece se chamar o start novamente? O que acontece se chamar o run diretamente?
Linguagem de Programao III Programao Concorrente em Java Danilo Ricardo Barbosa de Arajo

Ciclo de Vida de Threads


Estados bsicos de uma thread:
Executando (running): uma thread em execuo est utilizando o processador (JVM), e est executando o cdigo do mtodo run Estados intermedirios em que a thread no est executando:
Suspenso Dormindo Bloqueado Outros

Pronto (ready): poder ir para o estado executando assim que processador indique que a vez desta thread Morto (dead): a execuo do mtodo run finalizou para esta thread
Linguagem de Programao III Programao Concorrente em Java Danilo Ricardo Barbosa de Arajo

Ciclo de Vida de Threads


Yielding:
Uma thread entra no estado pronto espontaneamente para que outras threads possam executar Se no houver nenhuma outra thread elegvel para executar a thread continua a execuo (considera prioridades) disparado chamando o mtodo esttico Thread.yield() Exemplo: thread para processamento de imagem x cancelamento de operao pela GUI

Linguagem de Programao III Programao Concorrente em Java Danilo Ricardo Barbosa de Arajo

Ciclo de Vida de Threads

Linguagem de Programao III Programao Concorrente em Java Danilo Ricardo Barbosa de Arajo

Ciclo de Vida de Threads


Dormindo:
Uma thread fica dormindo pelo tempo especificado, sem usar a CPU Quando o tempo acaba entra no estado de pronto disparado chamando o mtodo esttico Thread.sleep(long m) e Thread.sleep(long m, int n) Se chamar o mtodo interrupt() a thread que est dormindo vai diretamente para pronto

Linguagem de Programao III Programao Concorrente em Java Danilo Ricardo Barbosa de Arajo

Ciclo de Vida de Threads


Join:
A primitiva join permite que uma thread espere pelo trmino de outra Se t um objeto Thread: t.join();
Possui o efeito da thread atual ser pausada e esperar o trmino de t

Linguagem de Programao III Programao Concorrente em Java Danilo Ricardo Barbosa de Arajo

Ciclo de Vida de Threads


Bloqueado:
Ocorre quando a thread precisa esperar pela ocorrncia de algum evento externo sua execuo Chamada de mtodos de entrada e sada Vrios mtodos da API de Java, como um read() para ler em um socket (rede) ou em um arquivo Quando a condio de bloqueio acaba a thread volta para o estado de pronto

Linguagem de Programao III Programao Concorrente em Java Danilo Ricardo Barbosa de Arajo

Ciclo de Vida de Threads


Esperando:
disparado quando uma thread chama o mtodo wait() A thread pra de executar e aguarda pela chamada de notify ou notifyAll por parte de outra thread suspend() x wait()
O suspend implementado na classe Thread enquanto que wait implementado no nvel de Object wait() s pode ser invocado em um mtodo synchronized (seo crtica)

Conceito de monitores (tpico seguinte)

Linguagem de Programao III Programao Concorrente em Java Danilo Ricardo Barbosa de Arajo

Ciclo de Vida de Threads


nascimento start pronto notify ou notifyAll interrupo de alocar um concluso de yield processador E/S executando wait inicia E/S sleep esperando
tempo para adormecer expira

completo morto bloqueado

dormindo

Interface Runnable
Situao: queremos criar uma Applet Java que execute como uma Thread Como criar uma classe que herda de outra classe (Applet) e uma Thread? Usamos a interface Runnable!
A interface Runnable exige a definio do mtodo run(); Uma classe que implementa a interface Runnable pode ser passada por parmetro para o construtor da classe Thread

Linguagem de Programao III Programao Concorrente em Java Danilo Ricardo Barbosa de Arajo

Interface Runnable

Linguagem de Programao III Programao Concorrente em Java Danilo Ricardo Barbosa de Arajo

Resumo
Nesta primeira parte do estudo de concorrncia o foco foi em:
Conceitos bsicos de programao concorrente Primitivas que permitem a manipulao de threads diretamente e ciclo de vida de threads

Na prxima parte do estudo de concorrncia ser abordado:


Conceito de monitores e sincronizao de threads Objetos de concorrncia de alto nvel

Linguagem de Programao III Programao Concorrente em Java Danilo Ricardo Barbosa de Arajo

Exerccio
Um programa Java foi colocado em um liquidificador e misturado!
Junte as linhas de cdigo mostradas na Figura 1 para compor as classes vazias mostradas na Figura 2. O cdigo obtido dever produzir a sada da Figura 3. Fique a vontade para adicionar pequenos detalhes, como alguns abre/fecha chaves!

1600 Bitz!
Linguagem de Programao III Programao Concorrente em Java Danilo Ricardo Barbosa de Arajo

Thread one = new Thread(t1);

Figura 1

ThreadTwo t2 = new ThreadTwo();

} cacth (InterruptedException ex) {}

System.out.println(Dois + a.getCount()); Acumulador a = Acumulador.getAcum(); try { implements Runnable { counter += add; return counter; Thread.sleep(50); one.start();

Thread two = new Thread(t2);


try {

public static void main(String[] args) {

public static Acumulador getAccum() { a.updateCounter(1); for (int x = 0; x < 99; x++) {

private int counter = 0; public int getCount() { Thread.sleep(50);

public void updateCounter(int add) { for (int x = 0; x < 98; x++) { two.start();

} cacth (InterruptedException ex) {}

private static Acumulador a = new Acumulador(); public void run() { implements Runnable {

Acumulador a = Acumulador.getAcum(); private Acumulador() {} public void run() {

ThreadOne t1 = new ThreadOne();

return a; a.updateCounter(1000);

Linguagem de Programao III Programao Concorrente em Java System.out.println (Hum + a.getCount()); Danilo Ricardo Barbosa de Arajo

Figura 2
public class Principal { class ThreadOne {

?
class Acumulador {

?
class ThreadTwo {

Linguagem de Programao III Programao Concorrente em Java Danilo Ricardo Barbosa de Arajo

Figura 3

Linguagem de Programao III Programao Concorrente em Java Danilo Ricardo Barbosa de Arajo

Linguagem de Programao III

Programao Concorrente na Linguagem Java


Prof. Danilo Ricardo Barbosa de Arajo
araujo.danilo.r.b@gmail.com

Você também pode gostar