Threads e Concorrência em Java (Material de Apoio)



Documentos relacionados
THREADS EM JAVA. George Gomes Cabral

Java Threads. Introdução

Programação Orientada a Objetos em Java. Threads Threads Threads. Threads

Multithreading. Programação Orientada por Objectos com Java. Ademar Aguiar. MRSC - Programação em Comunicações

(Aula 17) Threads em Java

Como foi exposto anteriormente, os processos podem ter mais de um fluxo de execução. Cada fluxo de execução é chamado de thread.

Programação Concorrente em java - Exercícios Práticos Abril 2004

Fundamentos de Programaçã. ção Concorrente

Universidade da Beira Interior. Sistemas Distribuídos

Universidade Federal da Paraíba

Threads em Java. Sistemas Operacionais - Laboratório Professor Machado

Programação Concorrente em Java. Profa Andréa Schwertner Charão DLSC/CT/UFSM

Programação Concorrente com Thread Java. Luiz Affonso Guedes Sistemas Distribuidos

Programação Concorrente

Java : Comunicação Cliente-Servidor.

Curso Adonai QUESTÕES Disciplina Linguagem JAVA

Threads. O que é uma Thread? Paralelismo

Analisar os sistemas operacionais apresentados na figura e responder as questões abaixo: Identificar

Mecanismo de Threads em Java 2

Programação Orientada a Objetos Threads

Aula 30 - Sockets em Java

Threads e Sockets em Java. Threads em Java. Programas e Processos

Introdução a Threads Java

Módulo 07 Características Avançadas de Classes

Introdução ao uso de Threads em Java

(Aula 15) Threads e Threads em Java

PROCESSOS. Prof. Maicon A. Sartin

Análise de Programação

Programação de Computadores - I. Profª Beatriz Profº Israel

Threads Aula 04 2 Quadrimestre

Sistemas Operacionais

Sistemas Paralelos e Distribuídos /2004 Curso: Matemática /Informática Sistemas Distribuídos /2004 Curso: Ensino da Informática

Processos e Threads (partes I e II)

Sistemas Distribuídos

Num sistema de objectos distribuídos, dois conceitos são fundamentais.

A ) O cliente terá que implementar uma interface remota. . Definir a interface remota com os métodos que poderão ser acedidos remotamente

Computação Paralela. Uma framework para aplicações concorrentes João Luís Ferreira Sobral Departamento do Informática Universidade do Minho

Até o final de década de 70, os sistemas operacionais suportavam apenas processos com um único thread;

Utilizando Threads em Java

Java. Marcio de Carvalho Victorino

2 Orientação a objetos na prática

Programação Concorrente Conceitos Multiprogramação Threads

Programação Concorrente/Paralela em Java

Para criar uma animação precisamos de uma imagem e que ela contenha alguns frames. O número de frames é uma escolha sua.

DESENVOLVIMENTO PARA DISPOSITIVOS MÓVEIS. PROFª. M.Sc. JULIANA H Q BENACCHIO

Threads em Java. Java Threads. Java Componentes: JVM JVM:

Comandos de repetição For (inicialização; condição de execução; incremento/decremento) { //Código }

BACHARELADO EM SISTEMAS DE INFORMAÇÃO EaD UAB/UFSCar Sistemas de Informação - prof. Dr. Hélio Crestana Guardia

Capítulo 4. Packages e interfaces

Linguagem de Programação JAVA. Técnico em Informática Professora Michelle Nery

Arquitetura de Sistemas Operacionais

Programa de Computador que funciona em Rede

Sincronização. Cooperação entre Processos

Técnicas de Programação II

UNIVERSIDADE FEDERAL DE VIÇOSA DEPARTAMENTO DE INFORMÁTICA. JAVA NA PRÁTICA Volume II. Alcione de Paiva Oliveira Vinícius Valente Maciel

8 Threads. 8.1 Introdução

Prova de Java. 1) Copie o programa abaixo no eclipse e complete-o, utilizando os conceitos aprendidos durante o curso. (4 pontos)

Programação por Objectos. Java

Is Event Dispatcher Threade (Animation)

Programação Concorrente em Java

Threads. Linguagem Java. Adenilso da Silva Simão 17/05/05

Implementando uma Classe e Criando Objetos a partir dela

Aula 2. Objetivos. Encapsulamento na linguagem Java; Utilizando a referência this.

Keeper of Knowledge. Capítulo 2 Classes em Java

Sobre o Professor Dr. Sylvio Barbon Junior

ESQUEMA AULA PRÁTICA 1 Familiarização com o Ambiente de Desenvolvimento Eclipse Introdução à Linguagem de Programação JAVA

ESQUEMA AULA PRÁTICA 1 Familiarização com o Ambiente de Desenvolvimento NetBeans Introdução à Linguagem de Programação JAVA

Noções sobre Objetos e Classes

Universidade da Beira Interior Cursos: Matemática /Informática e Ensino da Informática

Paradigmas da Programação PPROG. Linguagem JAVA. Interfaces. (Livro Big Java, Late Objects Capítulo 9) Nelson Freire (ISEP DEI-PPROG 2013/14) 1/33

insfcanceof new public switch transient while byte continue extends for int null

Sintaxe Geral Tipos de Dados. Prof. Angelo Augusto Frozza, M.Sc.

Invocação de Métodos Remotos

Concorrência em Java. Threads em Java

BSI UFRPE Prof. Gustavo Callou

Projeto de Software Orientado a Objeto

Chamadas Remotas de Procedimentos (RPC) O Conceito de Procedimentos. RPC: Programa Distribuído. RPC: Modelo de Execução

Programação Orientada a Objetos. Encapsulamento

Sistemas Operacionais Aula 06: Threads. Ezequiel R. Zorzal

Aula 09 Introdução à Java. Disciplina: Fundamentos de Lógica e Algoritmos Prof. Bruno Gomes

Exercício 1 : As classes abaixo serão utilizadas neste exercício: public class Ponto { int x; int y; public Ponto(int x, int y){ this.

Computação Concorrente (MAB-117) Monitores

Programação por Objectos. Java

Múltiplas Linhas de Execução Java (Threads)

Modificador static e Pacotes. Alberto Costa Neto DComp - UFS

SISTEMAS DISTRIBUÍDOS

APÊNDICE A EXEMPLO DE APLICAÇÃO

Java Básico. Classes Abstratas, Exceções e Interfaces Prof. Fernando Vanini Ic-Unicamp

7 RTTI e Interfaces. Desenvolvimento OO com Java. Vítor E. Silva Souza (vitorsouza@inf.ufes.br)

Módulo 02 Programação Orientada a Objetos. Última atualização: 07/06/2010

[Magee 1999] Concurrency State Models and Java Programs, Jeff Magee, Jeff Kramer, John Wiley 1999.

PUC-SP Depto. de Ciência da Computação

Transcrição:

Introdução Threads e Concorrência em Java (Material de Apoio) Professor Lau Cheuk Lung http//www.inf.ufsc.br/~lau.lung INE-CTC-UFSC A maioria dos programas são escritos de modo seqüencial com um ponto de início (método main()), uma seqüência de execuções e um ponto de término. Em qualquer dado instante existe apenas uma instrução sendo executada. O que são threads? É um simples fluxo seqüencial de execução que percorre um programa. Multithreading o programador especifica que os aplicativos contêm fluxos de execução (threads), cada thread designando uma parte de um programa que pode ser executado simultaneamente com outras threads. 1 INE-CTC-UFSC 2 Programação concorrente Todo programa, sendo monothread ou multithread, inicia com a execução da thread principal. Exemplo de um programa monothread main() g() g() Exemplo de um programa multithread main() g() g() Mecanismos de sincronização e prioridade podem ser usados para controlar a ordem de execução de threads independentes e colaboradas. Programação concorrente Por que usar threads? Permitir que um programa faça mais de uma coisa ao mesmo tempo. Cada thread pode fazer coisas diferentes ao mesmo tempo, por exemplo Uma thread baixando uma figura da rede e outra renderizando uma imagem; Uma gerenciando a edição de um texto e outra cuidando da impressão de um outro documento em background; Criação de várias threads para processamento de uma tarefa de forma paralela. Quando não usar threads? Quando um programa é puramente seqüencial. INE-CTC-UFSC 3 INE-CTC-UFSC 4 Threads em Java Threads Java são implementadas pela classe Thread do pacote java.lang Esta classe implementa um encapsulamento independente de sistema, isto é, a implementação real de threads é oferecida pelo sistema operacional. A classe Thread oferece uma interface unificada para todos os sistemas. Portanto, uma mesma implementação do Java Thread pode fazer com que a aplicação proceda de forma diferentes em cada sistema. Ver a API Thread Java em java.lang.thread http//java.sun.com Threads em Java Criando uma nova Thread Para que uma thread possa executar um método de uma classe, a classe deve Herdar (extend) a classe Thread (o qual implementa a classe Runnable em si), ou; Implementar a interface Runnable. INE-CTC-UFSC 5 INE-CTC-UFSC 6 1

Herdando a class Thread class MinhaThread1 extends Thread { O método run() contém o código que a thread executa. class Teste1 { new MinhaThread1().start(); Para executar a thread é necessário instanciar a classe MinhaThread e invocar o método start(). INE-CTC-UFSC 7 Implementando a classe Runnable class MinhaThread2 implements Runnable { Desta forma, a classe MinhaThread pode herdar uma outra classe. class Teste2 { new Thread(new MinhaThread2()).start(); INE-CTC-UFSC 8 Execução paralela de threads class ImprimirThread_1 implements Runnable { String str; public ImprimirThread_1(String str) { this.str = str; for(;;) System.out.print(str); class TesteConcorrente { new Thread(new ImprimirThread_1("A")).start(); new Thread(new ImprimirThread_1("B")).start(); INE-CTC-UFSC 9 Execução paralela de threads Método yield(), cede o processamento para outra thread. class ImprimirThread_2 implements Runnable { String str; public ImprimirThread_2(String str) { this.str = str; System.out.print(str); Thread.currentThread().yield(); class TesteConcorrente2 { new Thread(new ImprimirThread_2("A")).start(); new Thread(new ImprimirThread_2("B")).start(); INE-CTC-UFSC 10 Thread diagrama de estado Thread diagrama de estado Nova thread new thread runnable non runnable Pronta running Em execução dead Esperando Adormecida Morta Bloqueada INE-CTC-UFSC 11 INE-CTC-UFSC 12 2

Prioridade de thread Cada thread possui uma prioridade de execução que vai de Thread. MIN_PRIORITY (igual a 1) a Thread.MAX_ PRIORITY (igual a 10). Importante uma thread herda a prioridade da thread que a criou. O algoritmo de escalonamento sempre deixa a thread (runnable) de maior prioridade executar. A thread de maior prioridade preempta as outras threads de menor prioridade. Se todas as threads tiverem a mesma prioridade, a CPU é alocada para todos, um de cada vez, em modo round-robin. getpriority() obtém a prioridade corrente da thread; setpriority() define uma nova prioridade. INE-CTC-UFSC 13 Prioridade de thread class BaixaPrioridade extends Thread { setpriority(thread.min_priority); System.out.println("Thread de baixa prioridade executando -> 1"); class AltaPrioridade extends Thread { setpriority(thread.max_priority); for(int i=0; i<5; i++) System.out.println("Thread de alta prioridade executando -> 10"); sleep(100); catch(interruptedexception e) { System.exit(0); InterruptedException lança exceção se a thread é interrompida pelo método interrupt(); INE-CTC-UFSC 14 Prioridade de thread class Lançador { public static void main(string args[]) { AltaPrioridade a = new AltaPrioridade(); BaixaPrioridade b = new BaixaPrioridade(); System.out.println("Iniciando threads"); b.start(); a.start(); // deixa as outras threads iniciar a execução. Thread.currentThread().yield(); System.out.println("Main feito"); Iniciando threads Main feito INE-CTC-UFSC 15 Grupo de Threads Cada thread pertence a um grupo de threads. Um thread group é um conjunto de threads com mecanismos para desempenhar operações em todos membros do conjunto. Se não definido, toda thread criada pertence ao grupo 'main'. stop() suspend() resume() ThreadGroup A Thread A1 Thread A2 Thread An stop() suspend() resume() class MinhaThread2 implements Runnable { ThreadGroup B Thread B1 Thread B2 Thread Bn INE-CTC-UFSC 16 Grupo de Threads Criando um grupo de threads ThreadGroup(String name) ThreadGroup(ThreadGroup parent, String name) Criando uma thread dentro de um thread group específico ThreadGroup meugrupo = new ThreadGroup("Grupo A"); Thread novathread = new Thread(meuGrupo, umobjrunnable, "Thread 11"); umobjrunnable objeto alvo cujo método run() é executado. Para saber qual grupo uma thread pertence use o método getthreadgroup() e depois getname(). INE-CTC-UFSC 17 Sincronização de Threads Quando muitas threads são executadas muitas vezes é necessário sincronizar suas atividades, por exemplo Prevenir o acesso concorrente a estruturas de dados no programa que são compartilhados entre as threads; class Main { public static void main(string argv[]) { MeuDado dado = new MeuDado(); new Thread(new Produtor(dado)).start(); new Thread(new Consumidor(dado)).start(); INE-CTC-UFSC 18 3

Sincronização de Threads Problema class Produtor implements Runnable { MeuDado dado; public Produtor(MeuDado dado) { this.dado=dado; int i; for(i=0;i<30;i++) { dado.armazenar(i); arma System.out.println ("Produtor "+i); // cochila por um tempo randômico (0 to 0.5 sec) Thread.sleep((int)(Math.random()*500)); catch (InterruptedException e) { Sincronização de Threads Problema class Consumidor implements Runnable { MeuDado dado; public Consumidor(MeuDado dado) { this.dado=dado; for(int i=0;i<30;i++) { System.out.println("Consumidor "+dado.carregar()); // cochila por um tempo randômico (0 to 0.5 sec) Thread.sleep((int)(Math.random()*500)); catch (InterruptedException e) { INE-CTC-UFSC 19 INE-CTC-UFSC 20 Sincronização de Threads Solução 1 Pronto = false; Ocupado = true; Ocupado = false; Pronto = true; int Dado; Dado = this.dado; // armazena o valor porque uma vez Pronto = false; // ocupado é "true" ele pode mudar Ocupado = true; // em qualquer tempo. return Dado; INE-CTC-UFSC 21 Java suporta sincronização de threads através do uso de monitores. Um monitor é um inibidor, como um token que uma thread pode adquirir e liberar Um monitor é associado com um objeto específico e funciona como uma tranca nesse objeto; Uma thread pode adquirir o monitor (ou token) de um objeto se nenhuma outra thread tiver ele, e pode liberá-lo quando quiser. Região crítica é um segmento de código, dentro de um programa, que não deve ser acessado concorrentemente. Em Java, esse segmento de código é declarado usando a palavra chave synchronized. INE-CTC-UFSC 22 Declarando uma seção de código sincronizada void minhaclasse() { // código não sincronizado synchronized(objcujomonitoréparaserusado) { // bloco sincronizado // mais código não sincronizado Declarando um método todo sincronizado synchronized meumetodo() { // bloco sincronizado INE-CTC-UFSC 23 public synchronized void armazenar(int a a Dado) { Ocupado=false; public synchronized int carregar() { INE-CTC-UFSC 24 4

Código corrigido synchronized(this) { Ocupado=false; synchronized(this) { Comentário Tem que fornecer um objeto para o synchronized; Não é adequado usar loop busy-wait (ver while), pois usa o processador. INE-CTC-UFSC 25 Sincronização usando eventos Faz uso dos métodos wait() e notify() para gerar eventos de espera e notificação para parar de esperar. public synchronized void armazenar(int Data) { while (Pronto) while (!Pronto) catch (InterruptedException e) { notify(); catch (InterruptedException e) { this.dado=data; notify(); public synchronized int carregar() { INE-CTC-UFSC 26 Barreira de sincronização Permite sincronizar varias threads em um ponto específico do código. Usada em aplicações onde todas as threads devem terminar uma fase antes de mover todas juntas para a próxima fase. Uma thread que alcança a barreira automaticamente Quando a última thread alcança a barreira ele notifyall() todas threads em espera. INE-CTC-UFSC 27 Barreira de sincronização import java.util.*; class Barreira { private int ThreadsParticipante; private int EsperandoNaBarreira; public Barreira(int num) { ThreadsParticipante = num; EsperandoNaBarreira = 0; public synchronized void Alcançado() { EsperandoNaBarreira++; if(threadsparticipante!= EsperandoNaBarreira) { catch (InterruptedException e) { else { notifyall(); EsperandoNaBarreira=0; INE-CTC-UFSC 28 Esperando uma thread terminar Algumas vezes é necessário esperar a terminação de uma thread, por exemplo, a thread principal (main) pode lançar uma thread secundária para processar uma tarefa INE-CTC-UFSC 29 5