Aula Threads Lpoo 3

Preview:

Citation preview

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

fabricio@utfpr.edu.br

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

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

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.

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

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.

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)

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.

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).

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.

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.

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.

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.

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.

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).

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.

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.

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.

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

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.

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

}

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

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).

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

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

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

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

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.

Recommended