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

Documentos relacionados
Threads. Leonardo Gresta Paulino Murta

Concorrência em Java. Threads em Java

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

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

Utilizando Threads em Java

Threads. O que é uma Thread? Paralelismo

MULTITHREADING. Prof.: Michele Nasu Tomiyama Bucci

Execução concorrente em Java: threads. O que são Threads? Criação e métodos de Threads Sincronização Comunicação entre Threads

Interfaces e Classes Internas

Tratamento de Exceções, Multithreads e arquivos (em Java) Programação Orientada a Objetos

Programação concorrente em Java

UNIVERSIDADE FEDERAL RURAL DE PERNAMBUCO Bacharelado em Sistemas de Informação. Processamento Paralelo Threads. Aluno: Wagner Palacio

Herança. Prof. Fernando V. Paulovich 23 de agosto de 2010

Programação Concorrente em Java

Sistemas Operacionais

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

Programação Orientada a Objetos (DPADF 0063)

Prof. Fernando V. Paulovich 8 de novembro de SCC Programação Orientada a Objetos

Só podem ser executados por uma Thread que detenha o lock do objecto

Gabriel de Oliveira Ramos Roland Teodorowitsch - Orientador

THREADS EM JAVA. George Gomes Cabral

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

Programação Paralela. Processos. Processos. Processos. Processos. Unidade 2

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

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

Threads, Gerenciamento de Threads. Pool de Threads, Grupo de Threads Variáveis Locais à Threads

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

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

Num programa em JAVA é possível definir diferentes sequências de execução independente: Threads.

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

Classes e Objetos. Prof. Fernando V. Paulovich 9 de agosto de 2010

(Aula 17) Threads em Java

Java Threads. Introdução

Tratamento de Exceção. Programação Orientada a Objetos Java (Rone Ilídio)

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

Programação de Computadores II TCC /Turma A 1

Fundamentos de Programaçã. ção Concorrente

ENTENDENDO O FRAMEWORK FORK/JOIN DE JAVA

INE5645 PROGRAMAÇAO PARALELA E DISTRIBUÍDA PROVA 1 18/09/2017 ALUNO: Prof. Bosco

Prof. Silvana Rossetto 9 de julho de DCC/IM/UFRJ

Sistemas Operacionais I Parte VI Threads

Programação Concorrente/Paralela em Java

Dados armazenados em um objeto podem ser tanto primitivos, tais como inteiros ou caracteres, ou referências para outros objetos.

Universidade de São Paulo (USP) Instituto de Ciências Matemáticas e de Computação (ICMC) Programação Orientada a Objetos (SCC0204)

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

Universidade da Beira Interior. Sistemas Distribuídos. Folha 4-1. Threads Daemon Threads

Fundamentos Básicos da linguagem Java (Programação Orientada a Objetos) Prof. Responsáveis Wagner Santos C. de Jesus

PROGRAMAÇÃO ORIENTADA A OBJETOS. Aula 11 - Threads e Concorrência

Fundamentos de Sistemas Operacionais

Lista 05 Herança. public class PessoaFisica extends Pessoa { private String RG; public PessoaFisica(){ super(); } public String getrg(){ return RG; }

Notas de Aula 09: Tratamento de exceções

Tratamento de Erros. Sérgio Luiz Ruivace Cerqueira

Módulo 5. Programação Orientada a Objetos. Programação Orientada a Objetos I Java (Rone Ilídio)

Exemplo Threads com Swing:

Programação de Computadores II

Programação Orientada a Objetos. Vagner Luz do Carmo - Vluzrmos

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

Utilização de threads em Java

// quando o estado do Sujeito muda

Programação Gráfica Parte 2 Versão em Java 2006 PUCPR Tutoria de Jogos 1º Ano

Computação Paralela. Especificação de Concorrência/Paralelismo. João Luís Ferreira Sobral Departamento do Informática Universidade do Minho

POO29004 Programação Orientada a Objetos

Roteiro. Introdução. Uma Introdução à Programação Orientada a Objetos e JAVA usando NetBeans. Objetos. Princípios da Orientação a Objetos

Quando um programa viola as restrições semânticas da linguagem, a JVM assinala um erro ao programa, sob a forma de exceção.

Universidade Federal da Paraíba

INE 5645 PROGRAMAÇÃO PARALELA E DISTRIBUIDA PROVA 2 12/06/2017 ALUNO

INE 5645 PROGRAMAÇÃO PARALELA E DISTRIBUIDA PROVA 2 03/07/2017 ALUNO

Tratamento de Exceções em Java

JAVA. Tópicos Especiais de Programação Orientada a Objetos. sexta-feira, 28 de setembro de 12

Tipos, Literais, Operadores

Tipos, Literais, Operadores

Programação Orientada a Objectos - P. Prata, P. Fazendeiro

TRATAMENTO DE EXCEÇÕES

PROGRAMAÇÃO ORIENTADA A OBJETOS: OCULTAR INFORMAÇÕES E ENCAPSULAMENTO

Ferramentas para Programação em Processadores Multi-Core

Java RMI. RMI Remote Method Invocation. Chamadas Remotas de Procedimentos (RPC) RPC - Implementação

Prof. Fernando V. Paulovich 8 de novembro de SCC Programação Orientada a Objetos

INE 5645 PROGRAMAÇÃO PARALELA E DISTRIBUIDA PROVA 2 12/06/2017. ALUNO Prof. Bosco

LabSO Gerência de Processos. Retrospectiva da aula passada... Na aula passada... Na aula passada...

POO29004 Programação Orientada a Objetos

INE 5645 PROGRAMAÇÃO PARALELA E DISTRIBUIDA PROVA 2 03/07/2017 ALUNO

Programação Orientada a Objetos SANTOS, Rafael (PLT)

Implementando uma demonstração

Programação Concorrente

Sockets e Threads em Java

Programação Concorrente

Tratamento de Exceções. Profa. Thienne Johnson EACH/USP

Universidade da Beira Interior. Sistemas Distribuídos

UNIVERSIDADE FEDERAL DE MATO GROSSO DO SUL SISTEMAS DE INFORMAÇÃO - CÂMPUS DE COXIM FUNDAMENTOS EM ORIENTAÇÃO A OBJETOS

Programação Orientada a Objectos - P. Prata, P. Fazendeiro

JAVA APLICAÇÕES GRÁFICAS Propriedades Utilizadas: insira as propriedades escolhidas aqui FACULDADE DE TECNOLOGIA SENAC PELOTAS

INE 5645 PROGRAMAÇÃO PARALELA E DISTRIBUIDA PROVA 2 12/06/2017 ALUNO

1) Responda de acordo com os conceitos de orientação a objetos (0,5).

Herança. Fátima L. S. Nunes Luciano A. Digiampietri Norton T. Roman SISTEMAS DE INFORMAÇÃO 1

// quando o estado do Sujeito muda

O problema da herança múltipla e o uso de Interfaces. Herança múltipla. Interfaces. Definindo Interfaces 30/11/2016

Gerência de Processos Distribuídos: Sub processamento múltiplo.

Transcrição:

Múltiplas Linhas de Execução Java (Threads) SCC0604 - Programação Orientada a Objetos Prof. Fernando V. Paulovich http://www.icmc.usp.br/~paulovic paulovic@icmc.usp.br Instituto de Ciências Matemáticas e de Computação (ICMC) Universidade de São Paulo (USP) 25 de julho de 2010

Conceitos Básicos Sumário 1 Conceitos Básicos 2 Propriedades das Linhas de Execução 3 Sincronismo entre Linhas de Execução 4 Usando a Interface Runnable 5 Aguardando a Execução de uma Thread 6 Grupos de Linhas de Execução

Conceitos Básicos Sumário 1 Conceitos Básicos 2 Propriedades das Linhas de Execução 3 Sincronismo entre Linhas de Execução 4 Usando a Interface Runnable 5 Aguardando a Execução de uma Thread 6 Grupos de Linhas de Execução

Conceitos Básicos Introdução Apesar de usarmos na maior parte das vezes um computador mono-processador, é possível simular o funcionamento paralelo do mesmo Os programas de múltiplas linhas de execução ampliam a ideia o paralelismo: os programas individuais parecerão realizar várias tarefas ao mesmo tempo Normalmente, cada tarefa é chamada de linha de execução (thread)

Conceitos Básicos Introdução É dito que um programa que pode executar mais de uma linha de execução simultaneamente têm múltiplas linhas de execução Cada linha de execução é executada em um contexto separado, dessa forma é como se fosse possível obter paralelismo de execução Então qual a diferença entre múltiplos processos e múltiplas linhas de execução?

Conceitos Básicos O que são linhas de execução? O seguinte programa mostra que a execução de múltiplas coisas ao mesmo tempo sem o uso de linhas de execução pode ser problemática

Conceitos Básicos O que são linhas de execução? 1 public class Ball { 2 3 public void bounce() { 4 draw(); 5 for(int i = 1; i <= 1000; i++) { 6 move(); 7 try { 8 Thread.sleep(5); 9 } catch (InterruptedException e) {} 10 } 11 } 12 }

Conceitos Básicos O que são linhas de execução? Para acionar o sistema usa-se 1 Ball b = new Ball(painelBounce); 2 b.bounce();

Conceitos Básicos Usando linhas de execução para dar uma chance às outras tarefas Para resolver esse problema, vamos usar duas linhas de execução: uma para a bola e outra para a linha de execução principal Dessa forma, é possível deixar a bola quicando e ainda manipular a janela de apresentação

Conceitos Básicos Usando linhas de execução para dar uma chance às outras tarefas Uma forma simples de se executar um procedimento em uma linha de execução separado é por meio da inserção desse código em um método run() de uma classe derivada de Thread

Conceitos Básicos Usando linhas de execução para dar uma chance às outras tarefas 1 public class Ball extends Thread 2 3 public void run() { 4 draw(); 5 for(int i = 1; i <= 1000; i++) { 6 move(); 7 try { 8 Thread.sleep(5); 9 } catch (InterruptedException e) {} 10 } 11 } 12 }

Conceitos Básicos Executando e iniciando linhas de execução Quando um objeto derivado de Thread é construído, o método run() não é chamado automaticamente Isso deve ser feito chamando o método start() 1 Ball b = new Ball(painelBounce); 2 b.start();

Conceitos Básicos Executando e iniciando linhas de execução Em Java, uma linha de execução precisa dizer às outras linhas quando está ociosa, para que as outras linhas tenham a chance de executar seus códigos do método run() Normalmente isso é feito usando-se o método sleep() O que signica fazer Ball herdar de Thread? Isso não é estranho pelas características de uma herança?

Conceitos Básicos Executando diversas linhas de execução

Propriedades das Linhas de Execução Sumário 1 Conceitos Básicos 2 Propriedades das Linhas de Execução 3 Sincronismo entre Linhas de Execução 4 Usando a Interface Runnable 5 Aguardando a Execução de uma Thread 6 Grupos de Linhas de Execução

Propriedades das Linhas de Execução Propriedades das linhas de execução As linhas de execução podem estar em um dos quatro estados Nova Passível de execução Bloqueada Morta

Propriedades das Linhas de Execução Linhas de execução novas Quando uma linha de execução é criada com o método new - por exemplo, new Ball() - a linha ainda não está em execução, mas está no estado novo

Propriedades das Linhas de Execução Linhas de execução passíveis de execução Quando o método start() é chamado, a linha de execução é passível de execução Uma linha de execução passível de execução pode não estar sendo executada ainda, isso ca por conta do sistema operacional Quando o código de uma linha de execução começa a ser executado, a linha está em execução

Propriedades das Linhas de Execução Linhas de execução bloqueadas Uma linha de execução está no estado de bloqueada quando Alguém chama o método sleep() da mesma A mesma chama uma operação que está bloqueando entrada/saída A linha de execução chama o método wait() A linha de execução tenta bloquear um objeto que está bloqueado por outra execução Alguém chama o método suspend() da linha de execução

Propriedades das Linhas de Execução Saindo do estado de bloqueio Uma linha de execução sai do estado bloqueado e volta para o passível de execução quando O número especicado de milissegundos expirou em uma chamada sleep() Uma operação de E/S esperada terminou A mesma está em wait() e alguém chama notify()/notifyall() A mesma está esperando um bloqueio de um objeto pertencente a outra linha, e essa linha cede esse bloqueio A mesma está suspensa (suspend()) e o método resume() foi chamado

Propriedades das Linhas de Execução Linhas de execução mortas Uma linha de execução morre por duas razões Quando o método run() encerra Quando uma exceção não capturada encerra o método run() Uma outra forma, depreciada, de matar uma linha de execução é chamar o método stop() O método stop() não é para ser usado, nada garante que o mesmo funcionará!

Propriedades das Linhas de Execução Estados de uma linha de execução

Propriedades das Linhas de Execução Prioridades da linha de execução Em Java, todo linha de execução tem prioridade A prioridade de uma linha de execução pode ser aumentada ou diminuída aplicando-se o método setpriority() Os valores de prioridade podem estar entre 1 (MIN_PRIORITY) e 10 (MAX_PRIORITY) NORM_PRIORITY é igual a 5

Propriedades das Linhas de Execução Prioridades da linha de execução Uma linha de execução com alta prioridade executa até que A mesma cede a vez, chamando o método yield() Sai do estado de passível de execução Outra linha de execução de prioridade mais alta torna-se passível de execução

Propriedades das Linhas de Execução Prioridades da linha de execução 1 private void botaoexpressactionperformed(actionevent evt) { 2 for(int i=0; i < 5; i++) { 3 Ball b = new Ball(painelBounce, Color.RED); 4 b.setpriority(thread.norm_priority+2); 5 b.start(); 6 } 7 } 8 9 private void botaostartactionperformed(actionevent evt) { 10 for(int i=0; i < 5; i++) { 11 Ball b = new Ball(painelBounce, Color.BLACK); 12 b.setpriority(thread.norm_priority); 13 b.start(); 14 } 15 }

Sincronismo entre Linhas de Execução Sumário 1 Conceitos Básicos 2 Propriedades das Linhas de Execução 3 Sincronismo entre Linhas de Execução 4 Usando a Interface Runnable 5 Aguardando a Execução de uma Thread 6 Grupos de Linhas de Execução

Sincronismo entre Linhas de Execução Sincronismo Na maioria dos programas com múltiplas linhas de execução, duas ou mais linhas precisam compartilhar o acesso aos mesmos objetos Dependendo da ordem em que os dados foram acessados, o resultado pode danicar os objetos Tal situação é frequentemente chamada de condição de corrida (race condition)

Sincronismo entre Linhas de Execução Comunicação de linhas de execução sem sincronismo Para evitar acesso simultâneo de um objeto compartilhado por diversas linhas de execução, você deve sincronizar o acesso

Sincronismo entre Linhas de Execução Comunicação de linhas de execução sem sincronismo 1 class Bank { 2... 3 public void transfer(int from, int to, int amount) { 4 if (accounts[from] < amount) return; 5 accounts[from] -= amount; 6 accounts[to] += amount; 7 ntransacts++; 8 if (ntransacts % NTEST == 0) test(); 9 } 10 }

Sincronismo entre Linhas de Execução Comunicação de linhas de execução sem sincronismo 1 class TransferThread extends Thread { 2 public TransferThread(Bank b, int from, int max) { 3... 4 } 5 6 public void run() { 7 try { 8 while (!interrupted()) { 9 int toaccount = (int)(bank.size() * Math.random()); 10 int amount = (int)(maxamount * Math.random()); 11 bank.transfer(fromaccount, toaccount, amount); 12 sleep(1); 13 } 14 } catch (InterruptedException e) {} 15 } 16 }

Sincronismo entre Linhas de Execução Comunicação de linhas de execução sem sincronismo 1 public class UnsynchBankTest { 2 public static void main(string[] args) { 3 Bank b = new Bank(NACCOUNTS, INITIAL_BALANCE); 4 int i; 5 for (i = 0; i < NACCOUNTS; i++) { 6 TransferThread t = new TransferThread(b, i, INITIAL_BALANCE); 7 t.setpriority(thread.norm_priority + i % 2); 8 t.start(); 9 } 10 } 11 12 public static final int NACCOUNTS = 1000; 13 public static final int INITIAL_BALANCE = 100; 14 }

Sincronismo entre Linhas de Execução Comunicação de linhas de execução sem sincronismo

Sincronismo entre Linhas de Execução Sincronizando o acesso a recursos compartilhados O problema ocorrido anteriormente se dá quando duas linhas de execução estão tentando atualizar uma conta simultaneamente 1 accounts[to] += amount; O problema é que essa operação não é atômica!

Sincronismo entre Linhas de Execução Sincronizando o acesso a recursos compartilhados O problema dessa forma consiste no fato do método transfer() poder ser interrompido no meio Para corrigir esse problema é necessário garantir que esse método seja executado por inteiro antes da linha de execução perder o controle de execução Isso pode ser feito simplesmente declarando tal método como synchronized

Sincronismo entre Linhas de Execução Sincronizando o acesso a recursos compartilhados 1 class Bank { 2... 3 public synchronized void transfer(int from, int to, int amount) { 4 if (accounts[from] < amount) return; 5 accounts[from] -= amount; 6 accounts[to] += amount; 7 ntransacts++; 8 if (ntransacts % NTEST == 0) test(); 9 } 10 }

Sincronismo entre Linhas de Execução Sincronizando o acesso a recursos compartilhados Quando uma linha de execução chama um método synchronized é garantido que o método concluirá sua execução, antes que outra possa executar qualquer outro método synchronized no mesmo objeto

Usando a Interface Runnable Sumário 1 Conceitos Básicos 2 Propriedades das Linhas de Execução 3 Sincronismo entre Linhas de Execução 4 Usando a Interface Runnable 5 Aguardando a Execução de uma Thread 6 Grupos de Linhas de Execução

Usando a Interface Runnable A interface Runnable Quando é necessário usar múltiplas linhas de execução em uma classe que já é derivada de uma classe diferente de Thread, a interface Runnable deve ser usada

Usando a Interface Runnable A interface Runnable 1 class TransferThread implements Runnable { 2 3 public TransferThread(Bank b, int from, int max) { 4... 5 } 6 7 public void run() { 8... 9 } 10 11 private Bank bank; 12 private int fromaccount; 13 private int maxamount; 14 }

Usando a Interface Runnable A interface Runnable Para criar uma linha de execução com base em um objeto que implementa Runnable, deve-se criar um objeto Thread e passar no seu construtor o objeto que implementa a interface Runnable 1 Thread t = new Thread(new TransferThread(...)); 2 t.setpriority(thread.norm_priority); 3 t.start();

Aguardando a Execução de uma Thread Sumário 1 Conceitos Básicos 2 Propriedades das Linhas de Execução 3 Sincronismo entre Linhas de Execução 4 Usando a Interface Runnable 5 Aguardando a Execução de uma Thread 6 Grupos de Linhas de Execução

Aguardando a Execução de uma Thread Esperando um Thread Terminar Ao se chamar o método start() em uma Thread, essa passa a ser passível de execução e o restante do código após o start() continua a ser executado Esse pode ser um efeito inconveniente se em algum ponto do código se faça o uso do que é executado (calculado) dentro de ume Thread

Aguardando a Execução de uma Thread Esperando um Thread Terminar 1 public class TesteJoin extends Thread { 2 3 public TesteJoin(String id) { 4 this.id = id; 5 } 6 7 @Override 8 public void run() { 9 try { 10 Thread.sleep(3000); 11 System.out.println(id); 12 } catch (InterruptedException ex) { 13 } 14 } 15 16 private String id; 17 } 1 public static void main(string[] args) { 2 TesteJoin t1 = new TesteJoin("teste 1"); 3 TesteJoin t2 = new TesteJoin("teste 2"); 4 5 t1.start(); 6 t2.start(); 7 8 System.out.println("passou..."); 9 }

Aguardando a Execução de uma Thread Esperando um Thread Terminar Para se criar um ponto no código que que esperando o término de uma Thread, chama-se o método join() da Thread 1 public static void main(string[] args) throws InterruptedException { 2 TesteJoin t1 = new TesteJoin("teste 1"); 3 TesteJoin t2 = new TesteJoin("teste 2"); 4 5 t1.start(); 6 t2.start(); 7 8 t1.join(); 9 t2.join(); 10 11 System.out.println("passou..."); 12 }

Grupos de Linhas de Execução Sumário 1 Conceitos Básicos 2 Propriedades das Linhas de Execução 3 Sincronismo entre Linhas de Execução 4 Usando a Interface Runnable 5 Aguardando a Execução de uma Thread 6 Grupos de Linhas de Execução

Grupos de Linhas de Execução Introdução Desde Java 1.5, o modo mais seguro de se manipular Threads é por meio do pacote java.util.concurrent Usando-se esse pacote é possível criar conjuntos ( pool) de Threads e gerenciar o comportamento desse conjunto como um todo Uma das principais classes para o gerenciamento de Threads é a ExecutorService

Grupos de Linhas de Execução Criando um Thread 1 public class LinhaExecucao extends Thread { 2 3 public LinhaExecucao(String nome) { 4 this.nome = nome; 5 } 6 7 @Override 8 public void run() { 9 try { 10 for (int i = 0; i < 100; i++) { 11 System.out.println(nome); 12 Thread.sleep(50); 13 } 14 } catch (InterruptedException ex) { 15 } 16 } 17 18 private String nome; 19 }

Grupos de Linhas de Execução Usando a ExecutorService Para se controlar um grupo de Threads, cria-se um ExecutorService Para se executa uma Thread, chama-se o método execute(...) do ExecutorService 1 public static void main(string[] args) { 2 //cria um pool para a execuação simultânea de no máximo 3 Threads 3 ExecutorService executor = Executors.newFixedThreadPool(3); 4 5 //cria Threads e põe para execução 6 for(int i=0; i < 10; i++) { 7 LinhaExecucao le = new LinhaExecucao("linha: "+i); 8 executor.execute(le); 9 } 10 }

Grupos de Linhas de Execução Usando a ExecutorService A classe ExecutorService ainda fornece outros métodos shutdown() : não permite que mais nenhuma Thread seja adicionada ao ExecutorService shutdownnow() : para imediatamente a execução das Threads sendo executadas pelo ExecutorService É possível se criar outros tipos de ExecutorService Executor.newSingleThreadExecutor(): cria um executor de uma única Thread etc.

Grupos de Linhas de Execução Maiores informações Para maiores informações sobre as linhas de execução e seu funcionamento consulte o Capítulo 1 do livro Core Java 2, Volume II - Recursos Avançados