Mecanismo de Threads em Java 2



Documentos relacionados
THREADS EM JAVA. George Gomes Cabral

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

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

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

Universidade da Beira Interior. Sistemas Distribuídos

Curso Adonai QUESTÕES Disciplina Linguagem JAVA

Programação por Objectos. Java

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

Reuso com Herança a e Composiçã

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

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

Java. Marcio de Carvalho Victorino

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

Introdução a Java. Hélder Nunes

CURSO DE PROGRAMAÇÃO EM JAVA

Grupo I [6v] Considere o seguinte extracto de um programa de definição de uma calculadora apenas com a função soma de dois valores reais

Java : Comunicação Cliente-Servidor.

Java Threads. Introdução

Aula 30 - Sockets em Java

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

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

Java 2 Standard Edition Como criar classes e objetos

Programação por Objectos. Java

FBV - Linguagem de Programação II. Um pouco sobre Java

Keeper of Knowledge. Capítulo 2 Classes em Java

Web Browser como o processo cliente. Servidor web com páginas estáticas Vs. Aplicações dinâmicas para a Web:

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

Orientação a Objetos

Implementando uma Classe e Criando Objetos a partir dela

PROGRAMAÇÃO ORIENTADA A OBJETOS -TRATAMENTO DE EXCEÇÕES. Prof. Angelo Augusto Frozza, M.Sc. frozza@ifc-camboriu.edu.br

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

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

Projeto de Software Orientado a Objeto

Curso de Java. Orientação a objetos e a Linguagem JAVA. TodososdireitosreservadosKlais

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

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

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

Guia de Fatores de Qualidade de OO e Java

Grupo I [4v] executaprograma();

MANUAL DO UTILIZADOR

Prof. Esp. Adriano Carvalho

UNIVERSIDADE FEDERAL DO PARANÁ

(Aula 17) Threads em Java

Técnicas de Programação II

Grupo I [6,6v] Responda com os valores que se observam depois da chamada acontecer. 1 Falta na mensagem de resposta. Valor retornado na chamada

Encapsulamento de Dados

NOVIDADES DO JAVA PARA PROGRAMADORES C

Introdução à Linguagem Java

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

PROGRAMAÇÃO JAVA. Parte 1

Programação Avançada

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

ATRIBUTOS PRIVADOS 6. ENCAPSULAMENTO MÉTODOS PRIVADOS MÉTODOS PRIVADOS

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

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.

Para desenvolver a atividade a atividade desta aula utilizaremos o ambiente de desenvolvimento integrado NetBeans.

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

Programação por Objectos. Java

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

Programação 2ºSemestre MEEC /2011. Programação 2º Semestre 2010/2011 Enunciado do projecto

Manual de Utilizador Documentos de Transporte. TOConline. Suporte. Página - 1

Polimorfismo. Prof. Leonardo Barreto Campos 1

Noções sobre Objetos e Classes

Exercícios de Revisão Java Básico

2 Orientação a objetos na prática

INF1013 MODELAGEM DE SOFTWARE

Java - Introdução. Professor: Vilson Heck Junior. vilson.junior@ifsc.edu.br

Servidores Virtuais. Um servidor à medida da sua empresa, sem investimento nem custos de manutenção.

Plataforma. Manual de Utilização Acesso ao Procedimento Fornecedor. Electrónica BizGov

Grupo I [4v] b. [0,6v] De que forma é que o escalonador do Linux tenta minimizar o impacto desta limitação?

Persistência de Classes em Tabelas de Banco de Dados

Java para Desenvolvimento Web

Disciplina de Sistemas Distribuídos. Sincronização em SD. Prof. M.Sc. Alessandro Kraemer Kraemer

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

Coleções. Conceitos e Utilização Básica. c Professores de ALPRO I 05/2012. Faculdade de Informática PUCRS

Introdução à orientação a objetos. João Tito Almeida Vianna 25/05/2013

Programação Orientada a Objetos Prof. Rone Ilídio UFSJ/CAP

SAFT para siscom. Manual do Utilizador. Data última versão: Versão: Data criação:

Cadastramento de Computadores. Manual do Usuário

Aula 04 Operadores e Entrada de Dados. Disciplina: Fundamentos de Lógica e Algoritmos Prof. Bruno Gomes

Linguagens de. Aula 02. Profa Cristiane Koehler

PAINEL DE ADMINISTRADOR

Programação Orientada a Objetos C++

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

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

Programação Orientada a Objetos em Java

Reconhecer a estrutura de um sistema operativo. Definir um plano de instalação de um servidor de rede local.

Apresentação do VisualA

Processos e Threads (partes I e II)

(ou seja, boas praticas de programação orientada a objetos devem ser empregadas mesmo se não foram explicitamente solicitadas)

ZSRest. Manual de Configuração. Serviço de Entregas. V2011-Certificado

Análise de Programação

Prototype, um Design Patterns de Criação

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

Manual do Gestor da Informação do Sistema

Objetos Distribuídos - Programação Distribuída Orientado a Objetos. Luiz Affonso Guedes

Transcrição:

Mecanismo de Threads em Java 2

Índice MULTITHREADING : Múltiplos processos. 3 Paulo Costa, n.º 1000334 Mecanismo de Threads Página 2 de 20

MULTITHREADING : Múltiplos Processos As Threads são convenientes para programar. Permitem concentrar numa tarefa sem que o programa tenha que se preocupar como é que vai interagir com outras tarefas. Se for necessário ter de trabalhar duas tarefas em paralelo, simplesmente implementase uma thread para cada tarefa e iniciam se essas threads. Há no entanto que ter alguns cuidados. Observações: As tarefas podem ter que ser sincronizadas. Uma thread pode necessitar de um resultado que está a ser processado por outra thread. Procedimentos para implementar threads: 1) Colocar o código da tarefa no método run( ) da subclasse: run( ){... // tarefa a realizar 2) Construir um objecto da subclasse de Thread minhathread novoprocesso = new Thread( ) ; 3) Chama se o método start( ) para iniciar a tarefa novoprocesso.start( ) ; Aviso: Chamar o processo run( ) é INCORRECTO! Um exemplo: Imprimir no écrã as mensagens: Olá, LPG2! e Adeus, LPG2!, uma de cada por segundo e imprimir também o tempo para cada mensagem para se ver quando são impressas. Definição da classe que é subcalasse de Thread: public class minhathread Paulo Costa, n.º 1000334 Mecanismo de Threads Página 3 de 20

Acções para a thread: 1. Imprimir a data 2. Imprimir a mensagem 3. Esperar um segundo Obs.: constrói se um objecto Date para se poder imprimir data e horas Ficheiro minhathread.java: import java.util.date; public class minhathread extends Thread{ private static final int REPETICOES = 10; private static final int ATRASO=1000; private String mensagem; public minhathread(string msg){ mensagem = msg; // o método run é herdado da classe Thread e é re escrito: public void run(){ try{ for(int i=1; i<= REPETICOES; i++){ Date agora = new Date(); System.out.println( agora + " >> Mensagem: " + mensagem ); sleep(atraso); catch(interruptedexception ie){ Apesar de se poder testar o código neste mesmo ficheiro, fazê lo seria contra a filosofia da programação orientada a objectos, e assim a minhathread pode ser executada a partir de uma classe teste com o método estático main( ). Ficheiro TesteMinhaThread.java: import java.util.date; // pacote que contém a classe Date public class TesteMinhaThread{ public static void main(string[ ] args) throws java.lang.interruptedexception{ minhathread mt1 = new minhathread("ola, LPG2!"); minhathread mt2 = new minhathread("adeus, LPG2!"); Paulo Costa, n.º 1000334 Mecanismo de Threads Página 4 de 20

// inicia a 1ª thread mt1.start() ; mt1.sleep(500); // inicia a 2ª thread mt2.start() ; // espera ½ segundo Durante a classe de teste podem usar se vários métodos dos quais se destacam os métodos start( ) que tem a função de executar o código que se escreveu no método run( ) e o método sleep( ) que vai suspender a thread por um tempo parametrizado em milisegundos. Eis um output da execução desta aplicação: Sun May 23 16:34:18 BST 2004 >> Mensagem: Ola, LPG2! Sun May 23 16:34:19 BST 2004 >> Mensagem: Adeus, LPG2! Sun May 23 16:34:19 BST 2004 >> Mensagem: Ola, LPG2! Sun May 23 16:34:20 BST 2004 >> Mensagem: Adeus, LPG2! Sun May 23 16:34:20 BST 2004 >> Mensagem: Ola, LPG2! Sun May 23 16:34:21 BST 2004 >> Mensagem: Adeus, LPG2! Sun May 23 16:34:21 BST 2004 >> Mensagem: Ola, LPG2! Sun May 23 16:34:22 BST 2004 >> Mensagem: Adeus, LPG2! Sun May 23 16:34:22 BST 2004 >> Mensagem: Ola, LPG2! Sun May 23 16:34:23 BST 2004 >> Mensagem: Adeus, LPG2! Sun May 23 16:34:23 BST 2004 >> Mensagem: Ola, LPG2! Sun May 23 16:34:24 BST 2004 >> Mensagem: Adeus, LPG2! Sun May 23 16:34:24 BST 2004 >> Mensagem: Ola, LPG2! Sun May 23 16:34:25 BST 2004 >> Mensagem: Adeus, LPG2! Sun May 23 16:34:25 BST 2004 >> Mensagem: Ola, LPG2! Sun May 23 16:34:26 BST 2004 >> Mensagem: Adeus, LPG2! Sun May 23 16:34:26 BST 2004 >> Mensagem: Ola, LPG2! Sun May 23 16:34:27 BST 2004 >> Mensagem: Adeus, LPG2! Sun May 23 16:34:27 BST 2004 >> Mensagem: Ola, LPG2! Sun May 23 16:34:28 BST 2004 >> Mensagem: Adeus, LPG2! Paulo Costa, n.º 1000334 Mecanismo de Threads Página 5 de 20

Gestor de Threads ( Scheduler ) A Java Virtual Machine disponibiliza um gestor de threads. Ao ser construído código com o mecanismo de threads estas são colocadas em agenda. Esta, não dá quaisquer garantias sobre a ordem em que várias threads vão ser executadas. Cada thread corre por um pequeno espaço de tempo, chamada de time sli ce fatia de tempo, então o gestor de threads atira outra qualquer escolhendo uma thread executável à disposição. Uma thread está pronta a ser executada se não estiver em modo sleep( ) ou bloqueada de outra forma. Resumo: As várias threads depois de iniciadas pelo método start( ) vão ser executadas aleatoriamente. Gestor de Threads ( Scheduler ) : Prioridades Podem atribuir se diferentes prioridades na implementação do código utilizando o método setpriority( int prioridade ), com um parâmetro do tipo primitivo inteiro compreendido no intervalo 0 10. Por defeito a prioridade é 5. valor atributo estático 0 Thread.MIN_PRIORITY... 5 Thread.NORM_PRIORITY... 10 Thread.MAX_PRIORITY Caso este método receba um inteiro fora deste intervalo é lançada uma excepção IllegalArgumentException e lança uma SecurityException se uma thread em execução não puder alterar o valor desta. Sempre que o gestro de threads precisa de decidir qual a thread a executar, escolhe a que tiver o valor de prioridade mais elevado. Se existir mais do que uma thread com a Paulo Costa, n.º 1000334 Mecanismo de Threads Página 6 de 20

mesma prioridade, qualquer umas deles será escolhida sem qualquer outro critério de selecção. Se uma thread com prioridade elevada a corda e nquanto está a ser executada outra com menos prioridade o gestor suspende a sua execução e activa a thread com maior prioridade. Tendo em conta programas actuais com objectos actuais as prioridades parecem ser muito úteis, mas tendo em conta uma das principais características da programação orientada a objectos: a hereditariedade, as prioridades podem tornar se perigosas na reutilizição de código. O mecanismo de threads fornece outra ferramenta que desarma esse perigo eventual: a sincronização. Paulo Costa, n.º 1000334 Mecanismo de Threads Página 7 de 20

Terminar Threads O método normal de terminar threads é quando o método run( ) retorna. Por vezes pode haver necessidade de terminar uma thread em execução. Por exemplo, se várias threads estiverm a tentar resolver o mesmo problema e uma delas encontrar a solução, torna se necessário notificar as outras para terminarem a sua execução. Usa se o método interrupt( ). Primeiro o método checkaccess( ) é executado e depois a thread é terminada. Para verificar se o estado da thread foi alterado ou não pode usarse o método isinterrupted( ). No exemplo de criação de data e impressão de uma mensagem podia ter se escrito da seguinte maneira: public void run(){ try{ for( int i=1; i <= REPETICOES &&! isinterrupted() ; i++){ Date agora = new Date(); System.out.println( agora + " >> Mensagem: " + mensagem ); sleep(atraso); catch(interruptedexception ie){ Paulo Costa, n.º 1000334 Mecanismo de Threads Página 8 de 20

Grupos de Threads Num programa com muitas threads, estas podem ser colocadas num grupo. Escolhe se um nome: String nome = me ugrupo ; ThreadGroup grupo = new ThreadGroup( nome ) ; A grande vantagem é que se for necessário as threads podem ser geridas em simultâneo. No caso de ser necessário utilizar o método interrupt( ) para todas as threads em execução basta escrever: grupo.interrupt( ) ; Um exemplo prático é a situação em que várias threads carregam várias partes de uma página web e o utilizador decide que já não quer ver essa página, o programa pode então terminar todas as threads em simultâneo. Paulo Costa, n.º 1000334 Mecanismo de Threads Página 9 de 20

Sincronização Observações: Várias threads podem ser sincronizadas. Duas ou mais threads podem aceder ao mesmo objecto. O somatório destas duas características pode levar a resultados inesperados. O acesso partilhado a um objecto cria um problema que é conhecido como: Race Condition. As threads, cada qual no seu tempo de execução para executar a sua tarefa, manipulam um campo partilhado e o resultado depende de qual thread vence a competição. Se tivermos uma thread que tenha a função num determinado período de tempo de incrementar um objecto de classe NumEncomendas (número de encomendas) for (int i=0; i < REPETIR; i++ ){ enc.aumentaencomenda(10); System.out.print( (i+1) + ": Efectadas + " + quantidade + " Encomendas. "); System.out.println("Total de encomendas: " + enc.getnumencomendas() ); sleep(atraso); // atrasa 1/2 segundos e que tenhamos outra thread que tenha como função num determinado período de tempo de anular o número de encomendas do mesmo objecto pode levar a resultados enganadores. for(int i=0; i < REPETIR; i++ ){ enc.anulaencomenda(10); System.out.print("Anuladas " + quantidade + " Encomendas."); System.out.println("Total de encomendas: " +enc.getnumencomendas() ); sleep(atraso ); // atrasa 1/2 segundos Se tudo correr bem o output esperado será de que em 10 iterações (atributo do tipo primitivo final e estático REPETIR ) em que haja 10 encomendas e 10 anulações o resultado de enc.getnumencomendas( ) em que enc é um objecto do tipo parametrizado NumEncomenda será de zero encomendas. Paulo Costa, n.º 1000334 Mecanismo de Threads Página 10 de 20

Por exemplo ao invocar numa classe teste os seguintes métodos: public class TestNumEnc{ public static void main(string[] args){ NumEncomendas enc = new NumEncomendas(); ThreadEfectuarEnc thread1 = new ThreadEfectuarEnc( enc, 10 ); ThreadAnularEnc thread2 = new ThreadAnularEnc( enc, 10 ); thread1.start() ; thread2.start() ; O output esperado será: 1: Efectadas + 10 Encomendas. Total de encomendas: 10 Anuladas 10 Encomendas.Total de encomendas: 0 2: Efectadas + 10 Encomendas. Total de encomendas: 10 Anuladas 10 Encomendas.Total de encomendas: 0 3: Efectadas + 10 Encomendas. Total de encomendas: 10 Anuladas 10 Encomendas.Total de encomendas: 0 4: Efectadas + 10 Encomendas. Total de encomendas: 10 Anuladas 10 Encomendas.Total de encomendas: 0 5: Efectadas + 10 Encomendas. Total de encomendas: 10 Anuladas 10 Encomendas.Total de encomendas: 0 6: Efectadas + 10 Encomendas. Anuladas 10 Encomendas.Total de encomendas: 0 Total de encomendas: 0 7: Efectadas + 10 Encomendas. Total de encomendas: 10 Anuladas 10 Encomendas.Total de encomendas: 0 8: Efectadas + 10 Encomendas. Total de encomendas: 10 Anuladas 10 Encomendas.Total de encomendas: 0 9: Efectadas + 10 Encomendas. Total de encomendas: 10 Anuladas 10 Encomendas.Total de encomendas: 0 10: Efectadas + 10 Encomendas. Total de encomendas: 10 Anuladas 10 Encomendas.Total de encomendas: 0 Mas se por qualquer motivo (ou até porque pode haver mais threads em execução) e a ordem das threads for trocada, a imprevisibilidade do resultado dispara. Paulo Costa, n.º 1000334 Mecanismo de Threads Página 11 de 20

Sincronização de Acesso um Objecto Para resolver este tipo de problemas uma thread tem que ter a capacidade de fechar/trancar um objecto temporariamente. Assim, enquanto uma thread tiver um objecto trancado, nenhuma outra thread deve ser capaz de alterar o estado de um objecto. Usam se então os métodos sincronizados para bloquear os objectos. Basta marcar todos os métodos que sejam susceptíveis de conter código já afectado de threads com a palavra reservada synchronized. public class NumEncomendas { public synchronized void anular( ) { Cada objecto tem uma fechadura. Por defeito está destrancada. Uma thread pode trancar o objecto ao utilizar um método sincronizado, e este fica trancado até a thread abandonar o método. Quando outra thread invoca um método sincronizado tem que aguardar até que a outra thread abandone o método. Mais do que uma thread podem aguardar o destrancar de um método sincronizado. A thread que a seguir tem o direito de invocar e trancar o mesmo método é escolhida pelo gestor de threads de uma forma aleatória. Paulo Costa, n.º 1000334 Mecanismo de Threads Página 12 de 20

Apêndice A: Ficha Técnica Bibliografia Consultada: Big Java, [ Cay Horstmann ] Sebenta de LPG2 [ Fernando Mouta ] Sistema(s) Operativo(s): O código fonte dos exemplos apresentados foram escritos, compilados e executados em Suse9.0 Linux e em Windows XP Home Edition sem qualquer problema. Interface Gráfico: O ambiente de edição e compilação do código fonte foi o NetBeans IDE 3.5.1 da Sun Microsystems. Máquinas: Os programas foram executados com sucesso em duas máquinas: i. Pentium III 990 MHz com 512 MB de RAM ii. Pentium IV 2.40 GHz com 448 MB de RAM disponíveis Java Virtual Machine: j2sdk1.4.2 Aluno: Paulo Jorge Morais Costa n.º 1000334, turma 2AN tlm: +351 938 312 943 tlf: +351 229 955 048 email: i000334@dei.isep.ipp.pt web: http://www.dei.isep.ipp.pt/~i000334 Paulo Costa, n.º 1000334 Mecanismo de Threads Página 13 de 20

Apêndice B: Código Fonte // minhathread.java import java.util.date; public class minhathread extends Thread{ private static final int REPETICOES = 10; private static final int ATRASO=1000; private String mensagem; public minhathread(string msg){ mensagem = msg; public void run(){ try{ for(int i=1; i<= REPETICOES; i++){ Date agora = new Date(); System.out.println( agora + " >> Mensagem: " + mensagem ); sleep(atraso); catch(interruptedexception ie){ // TesteMinhaThread.java import java.util.date; public class TesteMinhaThread{ public static void main(string[] args) throws java.lang.interruptedexception{ minhathread mt1 = new minhathread("ola, LPG2!"); minhathread mt2 = new minhathread("adeus, LPG2!"); mt1.start() ; Paulo Costa, n.º 1000334 Mecanismo de Threads Página 14 de 20

mt1.sleep(500); mt2.start() ; // ThreadEfectuarEnc.java public class ThreadEfectuarEnc extends Thread{ private static final int REPETIR=10; // número de iteracoes a efectuar private static final int ATRASO=500; // valor da pausa entre processo; em milisegundos protected NumEncomendas enc ; protected int quantidade ; /** Construtor de uma thread que serve para aumentar o número de encomendas @param ne o objecto NumEncomendas que vai ser aumentado @param qtd a quantidade a incrementar */ public ThreadEfectuarEnc( NumEncomendas ne, int qtd ){ enc = ne ; quantidade = qtd ; /** Método herdado da classe Thread e que tem que ser re escrito */ public void run(){ try{ for(int i=0; i <= REPETIR &&! isinterrupted(); i++ ){ enc.aumentaencomenda(10); System.out.print( (i+1) + ": Efectadas + " + quantidade + " Encomendas. "); System.out.println("Total de encomendas: " + enc.getnumencomendas() ); sleep(atraso); // atrasa 1/2 segundos catch(interruptedexception ie){ Paulo Costa, n.º 1000334 Mecanismo de Threads Página 15 de 20

// ThreadAnularEnc.java public class ThreadAnularEnc extends Thread{ private static final int REPETIR=10; // número de iteracoes a efectuar private static final int ATRASO=2000; // valor da pausa entre processo; em milisegundos protected NumEncomendas enc ; protected int quantidade ; /** Construtor de uma thread que serve para reduzir o número de encomendas @param ne o objecto NumEncomendas que vai ser reduzido @param qtd a quantidade a anular */ public ThreadAnularEnc( NumEncomendas ne, int qtd ){ enc = ne ; quantidade = qtd ; /** Método herdado da classe Thread e que tem que ser re escrito */ public void run(){ try{ for(int i=0; i <= REPETIR &&! isinterrupted(); i++ ){ enc.anulaencomenda(10); System.out.print("Anuladas " + quantidade + " Encomendas."); System.out.println("Total de encomendas: " +enc.getnumencomendas() ); sleep(atraso); // atrasa 1/2 segundos catch(interruptedexception ie){ Paulo Costa, n.º 1000334 Mecanismo de Threads Página 16 de 20

// NumEncomendas.java public class NumEncomendas{ /** metodo que vai aumentar/actualizar a quantidade existente de encomendas. @param quantidade a acrescentar ao número de encomendas que já existem */ public void aumentaencomenda(int nova){ int enc = nova ; numenc += enc ; /** metodo que vai retirar/actualizar a quantidade existente de encomendas. @param número de anulaçoes a efectuar */ public void anulaencomenda(int tira){ int enc = tira; numenc = enc; /** metodo que consulta o total de encomendas efectuadas. @return número total de encomendas */ public int getnumencomendas(){ return numenc ; private int numenc ; // número total de encomendas // TestNumEnc.java public class TestNumEnc{ public static void main(string[] args){ NumEncomendas enc = new NumEncomendas(); ThreadEfectuarEnc thread1 = new ThreadEfectuarEnc( enc, 10 ); ThreadAnularEnc thread2 = new ThreadAnularEnc( enc, 10 ); thread1.start() ; Paulo Costa, n.º 1000334 Mecanismo de Threads Página 17 de 20

thread2.start() ; Paulo Costa, n.º 1000334 Mecanismo de Threads Página 18 de 20

Apêndice C: Métodos não estáticos da Classe Thread Métodos não estáticos que vão ser herdados pelas subclasses de Thread: clone( ) countstackframes( ) destroy( ) equals( Object ) finalize( ) getcontextclassloader( ) hashcode( ) interrupt( ) isinterrupted( ) run( ) setcontextclassloader( ) start( ) tostring( ) Paulo Costa, n.º 1000334 Mecanismo de Threads Página 19 de 20

Apêndice D: Disquete Disquete com apresentação de slides do trabalho teórico Threads.pps Paulo Costa, n.º 1000334 Mecanismo de Threads Página 20 de 20