Aula Threads Lpoo 3
-
Upload
anderson-brilhador -
Category
Documents
-
view
81 -
download
1
Transcript of 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
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.