Vous êtes sur la page 1sur 28

Multithreading Java

LPOO Prof. Fabrcio Martins Lopes fabricio@utfpr.edu.br

Objetivos da aula

O que so threads e sua utilidade Gerenciamento de atividades concorrentes Ciclo de vida de uma thread Prioridades e agendamentos Sincronizao Exemplos e aplicaes

Definio

A classe java.lang.Thread definida como:


public class Thread extends Object implements Runnable A interface Runnable deve ser implementada por qualquer classe cujas instncias so destinadas a serem executadas por uma thread. A classe deve implementar um mtodo sem argumentos chamado run. A especificao completa da classe Thread est disponvel em:
http://download.oracle.com/javase/6/docs/api/java/lang/Thread.html

Threads e sua utilidade

Executar operaes de forma paralela / concorrente. A maioria das LPs no permitem implementaes paralelas, como o C e C++. O Java disponibiliza a programao concorrente por meio da Thread. Esse recurso do Java, chamado multithreading, permite um programa executar concorrentemente com outras threads.
4

Classe Thread e seus estados

Prioridades

Os algoritmos preemptivos so algoritmos que permitem que um processo seja interrompido durante sua execuo. J os algoritmos no preemptivos, por serem utilizados exclusivamente em sistemas monoprocessados, esse fato no ocorre, sendo cada programa executado at o fim.

Prioridades

Cada thread Java te sua prpria prioridade. A prioridade ajuda o SO a determinar a ordem de execuo das threads. Prioridades usando atributos da classe Thread:

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


7

Prioridades

Threads com valor de prioridade mais alta recebem maior tempo de execuo do processador. Cada nova thread herda a prioridade da thread que a criou. O mtodo setPriority(int i) pode ser usado para atribuir um valor de prioridade para a thread.

Prioridades

Agendamento de prioridades Threds com valores de prioridades + altas por meio do agendamento preemptivo, podem adiar indefinidamente as threads com menor prioridade (inanio).

Criando e Executando threads

O modo preferido de criar um aplicativo com mltiplas threads implementar a interface Runnable (java.lang). Runnables so executadas por um objeto de uma classe que implementa a interface Executor (java.util.concurrent). O Executor declara um nico mtodo chamado execute. Um objeto Executor cria e gerencia um grupo de threads denomidado pool de threads.
10

Exemplos

class PrintTask implements Runnable class RunnableTester As duas classes esto disponveis no moodle.

11

Sincronizao de threads

Frequentemente, mltiplas threads de execuo manipulam um objeto compartilhado na memria. importante definir quando e como um objeto compartilhado ser acessado pelas mltiplas threads. O Java utiliza bloqueios para realizar a sincronizao.

12

Sincronizao de threads

Uma thread chama o mtodo lock para obter o bloqueio. Uma vez que o lock foi obtido, outra thread no poder obter o bloqueio novamente at que a thread o libere, chamando o mtodo unlock. Somente uma thread pode obter o bloqueio por vez.

13

Sincronizao de threads

Classe ReentrantLock implementa a interface Lock (java.util.concurrent.locks). O construtor de ReentrantLock aceita um parmetro booleano que especifica se o bloqueio tem uma diretiva de imparcialidade. A diretiva de imparcialidade (parmetro true) determina que a thread na espera mais longa vai obter o bloqueio quado estiver disponvel.

14

Sincronizao de threads

Pode ser definida uma varivel de condio para uma thread para determinar o bloqueio de uma thread. As variveis de condio devem ser associadas com um Lock e, so criadas a partir do mtodo newCondition da interface Lock que retorna um objeto Condition (java.util.concurrent.locks.Condition).

15

Sincronizao de threads

Para esperar uma varivel de condio a thread pode chamar o mtodo await de Condition. A chamada do mtodo await coloca a thread no estado de espera dessa Condition. Quando a thread em execuo completar a tarefa dependente, pode determinar que a thread na espera pode continuar a execuo, chamado o mtodo signal.
16

Sincronizao de threads

Se mltiplas threads estiverem na espera de uma Condition quando signal for chamado, a thread de espera mais longa ir se tornar executvel. Se uma thread chamar o mtodo Condition signalAll, todas as threads que esperam essa Condition mudam para o estado executvel. Quando uma thread concluir sua tarefa com um objeto compartilhado, ela deve chamar o mtodo unlock para liberar o objeto Lock.

17

Sincronizao de threads

O Impasse (deadlock) ocorre quando uma thread em espera no pode prosseguir porque est esperando outra thread e, simultaneamente a segunda thread no pode prosseguir porque est esperando a primeira. um erro se uma thread tentar chamar um await, signal ou signalAll em uma varivel de condio sem adquirir o bloqueio dessa varivel de condio. Isso causa uma IllegalMonitorStateException.
18

Exemplos

interface Buffer.java classe Producer.java classe Consumer.java classe UnsynchronizedBuffer.java classe SharedBufferTest.java Verso sincronizada: classe SynchronizedBuffer.java classe SharedBufferTest2.java
19

Monitores e bloqueios

Outra maneira de sincronizar as tarefas utilizar monitores. Cada objeto tem um monitor que permite a execuo de uma thread por vez quando estiver dentro de uma instruo synchronized. Isto realizado obtendo um bloqueio no objeto quando o programa entra na instruo synchronized.
20

Monitores e bloqueios

Essas instrues so declaradas utilizando a palavra chave synchronized. Exemplo: public synchronized int get() { notify(); }
21

Exemplos

classe SSynchronizedBuffer.java classe SharedBufferTest3.java

22

Multithreading com GUI

A natureza da programao de mltiplas threads impede que o programador saiba exatamente quando uma thread executar. Os componentes swing no so seguros se mltiplas threads manipulam um componente. Todas as interaes com componentes swing devem ser realizadas como parte da thread de despacho de evento (tambm conhecida como thread de tratamento de evento).

Multithreading com GUI

A classe SwingUtilities (javax.swing) fornece o mtodo esttico invokeLater para ajudar nesse processo. O mtodo invokeLater especifica instrues de processamento grfico para executar posteriormente como parte da thread de despacho de evento.

Multithreading com GUI

O mtodo invokeLater recebe como argumento um objeto que implementa a interface Runnable. O mtodo invokeLater coloca essa Runnable como um evento na fila da thread de despacho de eventos.

Multithreading com GUI

Esses eventos so processados na ordem que eles aparecem na fila. Como somente uma thread trata esses eventos, pode-se garantir que a interface grfica ser atualizada corretamente.

Exemplos

classe RunnableObject.java classe RandomCharacters.java

Referncias 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. So Paulo: Makron Books, 2001 v.1. e v.2. MORGAN, Michael. Java 2 para Programadores Profissionais. Rio de Janeiro: Cincia Moderna, 2000.