Aula Threads Lpoo 3

28
 Multithreading – Java LPOO Prof. Fabrício Martins Lopes [email protected]

Transcript of Aula Threads Lpoo 3

Page 1: Aula Threads Lpoo 3

5/11/2018 Aula Threads Lpoo 3 - slidepdf.com

http://slidepdf.com/reader/full/aula-threads-lpoo-3 1/28

Multithreading – Java 

LPOOProf. Fabrício Martins Lopes

[email protected]

Page 2: Aula Threads Lpoo 3

5/11/2018 Aula Threads Lpoo 3 - slidepdf.com

http://slidepdf.com/reader/full/aula-threads-lpoo-3 2/28

2

Objetivos da aula 

O que são threads e sua utilidade Gerenciamento de atividades concorrentes Ciclo de vida de uma thread

Prioridades e agendamentos Sincronização

Exemplos e aplicações

Page 3: Aula Threads Lpoo 3

5/11/2018 Aula Threads Lpoo 3 - slidepdf.com

http://slidepdf.com/reader/full/aula-threads-lpoo-3 3/28

3

Definição

A classe java.lang.Thread é definida como:public class Thread extends Object implements Runnable

A interface Runnable deve ser implementada por qualquer

classe cujas instâncias são destinadas a serem executadas poruma thread.

A classe deve implementar um método sem argumentoschamado run.

A especificação completa da classe Thread está disponível em:http://download.oracle.com/javase/6/docs/api/java/lang/Thread.html

Page 4: Aula Threads Lpoo 3

5/11/2018 Aula Threads Lpoo 3 - slidepdf.com

http://slidepdf.com/reader/full/aula-threads-lpoo-3 4/28

4

Threads e sua utilidade

Executar operações de forma paralela /concorrente.

A maioria das LPs não permitem

implementações paralelas, como o C e C++. O Java disponibiliza a programação

concorrente por meio da Thread.

Esse recurso do Java, chamadomultithreading, permite um programa executarconcorrentemente com outras threads.

Page 5: Aula Threads Lpoo 3

5/11/2018 Aula Threads Lpoo 3 - slidepdf.com

http://slidepdf.com/reader/full/aula-threads-lpoo-3 5/28

5

Classe Thread e seus estados

Page 6: Aula Threads Lpoo 3

5/11/2018 Aula Threads Lpoo 3 - slidepdf.com

http://slidepdf.com/reader/full/aula-threads-lpoo-3 6/28

6

Prioridades

Os algoritmos preemptivos são algoritmos quepermitem que um processo seja interrompidodurante sua execução.

Já os algoritmos não preemptivos, por seremutilizados exclusivamente em sistemasmonoprocessados, esse fato não ocorre, sendocada programa executado até o fim.

Page 7: Aula Threads Lpoo 3

5/11/2018 Aula Threads Lpoo 3 - slidepdf.com

http://slidepdf.com/reader/full/aula-threads-lpoo-3 7/28

7

Prioridades

Cada thread Java te sua própria prioridade. A prioridade ajuda o SO a determinar a ordem

de execução das threads. Prioridades usando atributos da classe

Thread: MIN_PRIORITY (constante == 1)

MAX_PRIORITY (constante == 10) NORM_PRIORITY (default, constante == 5)

Page 8: Aula Threads Lpoo 3

5/11/2018 Aula Threads Lpoo 3 - slidepdf.com

http://slidepdf.com/reader/full/aula-threads-lpoo-3 8/28

8

Prioridades

Threads com valor de prioridade mais altarecebem maior tempo de execução doprocessador.

Cada nova thread herda a prioridade dathread que a criou.

O método setPriority(int i) pode ser usadopara atribuir um valor de prioridade para athread.

Page 9: Aula Threads Lpoo 3

5/11/2018 Aula Threads Lpoo 3 - slidepdf.com

http://slidepdf.com/reader/full/aula-threads-lpoo-3 9/28

9

Prioridades

Agendamento deprioridades

Threds com valores deprioridades + altas por

meio do agendamentopreemptivo, podemadiar indefinidamente as threads com menorprioridade (inanição).

Page 10: Aula Threads Lpoo 3

5/11/2018 Aula Threads Lpoo 3 - slidepdf.com

http://slidepdf.com/reader/full/aula-threads-lpoo-3 10/28

10

Criando e Executando threads

O modo preferido de criar um aplicativo commúltiplas threads é implementar a interfaceRunnable (java.lang).

Runnables são executadas por um objeto deuma classe que implementa a interfaceExecutor (java.util.concurrent).

O Executor declara um único método chamadoexecute.

Um objeto Executor cria e gerencia um grupode threads denomidado pool de threads.

Page 11: Aula Threads Lpoo 3

5/11/2018 Aula Threads Lpoo 3 - slidepdf.com

http://slidepdf.com/reader/full/aula-threads-lpoo-3 11/28

11

Exemplos

class PrintTask implements Runnable

class RunnableTester

As duas classes estão disponíveis no moodle.

Page 12: Aula Threads Lpoo 3

5/11/2018 Aula Threads Lpoo 3 - slidepdf.com

http://slidepdf.com/reader/full/aula-threads-lpoo-3 12/28

12

Sincronização de threads

Frequentemente, múltiplas threads deexecução manipulam um objeto compartilhadona memória.

É importante definir quando e como umobjeto compartilhado será acessado pelasmúltiplas threads.

O Java utiliza bloqueios para realizar asincronização.

Page 13: Aula Threads Lpoo 3

5/11/2018 Aula Threads Lpoo 3 - slidepdf.com

http://slidepdf.com/reader/full/aula-threads-lpoo-3 13/28

13

Sincronização de threads

Uma thread chama o método lock para obtero bloqueio.

Uma vez que o lock foi obtido, outra thread não

poderá obter o bloqueio novamente até que athread o libere, chamando o método unlock. Somente uma thread pode obter o bloqueio por

vez.

Page 14: Aula Threads Lpoo 3

5/11/2018 Aula Threads Lpoo 3 - slidepdf.com

http://slidepdf.com/reader/full/aula-threads-lpoo-3 14/28

14

Sincronização de threads

Classe ReentrantLock implementa a interfaceLock (java.util.concurrent.locks).

O construtor de ReentrantLock aceita um

parâmetro booleano que especifica se obloqueio tem uma diretiva de imparcialidade. A diretiva de imparcialidade (parâmetro true)

determina que a thread na espera mais longavai obter o bloqueio quado estiver disponível.

Page 15: Aula Threads Lpoo 3

5/11/2018 Aula Threads Lpoo 3 - slidepdf.com

http://slidepdf.com/reader/full/aula-threads-lpoo-3 15/28

15

Sincronização de threads

Pode ser definida uma variável de condiçãopara uma thread para determinar o bloqueio deuma thread.

As variáveis de condição devem serassociadas com um Lock e, são criadas a partir do método newCondition da interfaceLock que retorna um objeto Condition 

(java.util.concurrent.locks.Condition).

Page 16: Aula Threads Lpoo 3

5/11/2018 Aula Threads Lpoo 3 - slidepdf.com

http://slidepdf.com/reader/full/aula-threads-lpoo-3 16/28

16

Sincronização de threads

Para esperar uma variável de condição athread pode chamar o método await deCondition.

A chamada do método await coloca a threadno estado de espera dessa Condition. Quando a thread em execução completar a

tarefa dependente, pode determinar que athread na espera pode continuar a execução, é chamado o método signal.

Page 17: Aula Threads Lpoo 3

5/11/2018 Aula Threads Lpoo 3 - slidepdf.com

http://slidepdf.com/reader/full/aula-threads-lpoo-3 17/28

17

Sincronização de threads

Se múltiplas threads estiverem na espera deuma Condition quando signal for chamado, athread de espera mais longa irá se tornarexecutável.

Se uma thread chamar o método ConditionsignalAll, todas as threads que esperamessa Condition mudam para o estado

executável. Quando uma thread concluir sua tarefa com

um objeto compartilhado, ela deve chamar ométodo unlock para liberar o objeto Lock.

Page 18: Aula Threads Lpoo 3

5/11/2018 Aula Threads Lpoo 3 - slidepdf.com

http://slidepdf.com/reader/full/aula-threads-lpoo-3 18/28

18

Sincronização de threads

O Impasse (deadlock) ocorre quando umathread em espera não pode prosseguir porqueestá esperando outra thread e,simultaneamente a segunda thread nào podeprosseguir porque está esperando a primeira.

É um erro se uma thread tentar chamar umawait, signal ou signalAll em uma variável de

condição sem adquirir o bloqueio dessavariável de condição. Isso causa umaIllegalMonitorStateException.

Page 19: Aula Threads Lpoo 3

5/11/2018 Aula Threads Lpoo 3 - slidepdf.com

http://slidepdf.com/reader/full/aula-threads-lpoo-3 19/28

19

Exemplos

interface Buffer.java classe Producer.java

classe Consumer.java

classe UnsynchronizedBuffer.java classe SharedBufferTest.java

Versão sincronizada: classe SynchronizedBuffer.java

classe SharedBufferTest2.java

Page 20: Aula Threads Lpoo 3

5/11/2018 Aula Threads Lpoo 3 - slidepdf.com

http://slidepdf.com/reader/full/aula-threads-lpoo-3 20/28

20

Monitores e bloqueios

Outra maneira de sincronizar as tarefas éutilizar monitores.

Cada objeto tem um monitor que permite a

execução de uma thread por vez quandoestiver dentro de uma instruçãosynchronized.

Isto é realizado obtendo um bloqueio no objetoquando o programa entra na instruçãosynchronized.

Page 21: Aula Threads Lpoo 3

5/11/2018 Aula Threads Lpoo 3 - slidepdf.com

http://slidepdf.com/reader/full/aula-threads-lpoo-3 21/28

21

Monitores e bloqueios

Essas instruções são declaradas utilizando apalavra chave synchronized.

Exemplo:

public synchronized int get() {…

notify();

}

Page 22: Aula Threads Lpoo 3

5/11/2018 Aula Threads Lpoo 3 - slidepdf.com

http://slidepdf.com/reader/full/aula-threads-lpoo-3 22/28

22

Exemplos

classe SSynchronizedBuffer.java

classe SharedBufferTest3.java

Page 23: Aula Threads Lpoo 3

5/11/2018 Aula Threads Lpoo 3 - slidepdf.com

http://slidepdf.com/reader/full/aula-threads-lpoo-3 23/28

 

Multithreading com GUI

A natureza da programação de múltiplasthreads impede que o programador saibaexatamente quando uma thread executará.

Os componentes swing não são seguros semúltiplas threads manipulam um componente. Todas as interações com componentes swing

devem ser realizadas como parte da thread dedespacho de evento (também conhecidacomo thread de tratamento de evento).

Page 24: Aula Threads Lpoo 3

5/11/2018 Aula Threads Lpoo 3 - slidepdf.com

http://slidepdf.com/reader/full/aula-threads-lpoo-3 24/28

 

Multithreading com GUI

A classe SwingUtilities (javax.swing) fornece ométodo estático invokeLater para ajudarnesse processo.

O método invokeLater especifica instruçõesde processamento gráfico para executarposteriormente como parte da thread dedespacho de evento.

l i h di G

Page 25: Aula Threads Lpoo 3

5/11/2018 Aula Threads Lpoo 3 - slidepdf.com

http://slidepdf.com/reader/full/aula-threads-lpoo-3 25/28

 

Multithreading com GUI

O método invokeLater recebe comoargumento um objeto que implementa ainterface Runnable.

O método invokeLater coloca essa Runnablecomo um evento na fila da thread dedespacho de eventos.

M l i h di GUI

Page 26: Aula Threads Lpoo 3

5/11/2018 Aula Threads Lpoo 3 - slidepdf.com

http://slidepdf.com/reader/full/aula-threads-lpoo-3 26/28

 

Multithreading com GUI

Esses eventos são processados na ordemque eles aparecem na fila.

Como somente uma thread trata esseseventos, pode-se garantir que a interfacegráfica será atualizada corretamente.

E l

Page 27: Aula Threads Lpoo 3

5/11/2018 Aula Threads Lpoo 3 - slidepdf.com

http://slidepdf.com/reader/full/aula-threads-lpoo-3 27/28

 

Exemplos

classe RunnableObject.java

classe RandomCharacters.java

Page 28: Aula Threads Lpoo 3

5/11/2018 Aula Threads Lpoo 3 - slidepdf.com

http://slidepdf.com/reader/full/aula-threads-lpoo-3 28/28

 

Referências Consultadas

DEITEL, P.J. Java - Como Programar. Porto Alegre:Bookman, 2003.

HORSTMANN, Cay. Big Java. Porto Alegre: Bookman, 2004.

HORSTMANN, Cay, S. e CORNELL, Gary. Core Java 2. SãoPaulo: Makron Books, 2001 v.1. e v.2.

MORGAN, Michael. Java 2 para Programadores

Profissionais. Rio de Janeiro: Ciência Moderna, 2000.