Explorar E-books
Categorias
Explorar Audiolivros
Categorias
Explorar Revistas
Categorias
Explorar Documentos
Categorias
dados dados
acessa globais
globais
invoca
internos ou
externos
Proc2
dados
locais
dados
Proc
Proc Proc
Principal
Dados de
cada classe/ dados
objeto
classe Classes contém
procedimentos
(métodos)
acessa invoca
Objetos:
Carro: Porsche 910 Placa XXXX
Avião: Boeing 737-300 Prefixo: PY-XXX
Pessoa: José da Silva CPF: XXXXXXX
Uma classe é um tipo definido pelo usuário que contém uma estrutura
de dados e um conjunto de operações que atuam sobre estes dados
Analogamente, é o mesmo que o tipo inteiro significa para as variáveis
declaradas como inteiros: acesso a valores através de operações
A classe encapsula dados e operações e controla o acesso a estas
propriedades
Data
públicos/privativos int dia,mes,ano
alteraData()
Nome Atributos
Operações
String
Nome
itálico: abstrata
Atributos operações não
Date implementadas
Operações
Herança
Uma classe pode utilizar métodos e atributos de outras
classes sem a necessidade de re-escrever ou copiar nada
através do mecanismo de Herança
public class Funcionario extends Pessoa {
double salario;
int id;
public double getSalario() {
return salario;
}}
Exemplo:
Avião e o método Mover
Comandos
Sintaxe
Estrutura
Exemplos
T ip o T am anho
b yte 1 b yte s
sh o rt 2 b yte s
in t 4 b yte s
lo n g 8 b yte s
flo a t 4 b yte s
d o u b le 8 b yte s
char 2 b yte s
b o o le a n 1 b it
Comando_vazio := ;
while ( ......... ) {
.........
if ( ......... ) break;
if ( ......... ) continue;
.........
}
......... /* Proximo comando a ser executado depois do break */
.........
Comando continue: encerra a iteração corrente e inicia a iteração seguinte.
97
Diagrama Simplicado de Exceções
99
Um exemplo de Try-catch
Paulo100
André Castro CE-703 / ITA
A cláusula finally
Ao final de um conjunto de blocos catch pode-se,
opcionalmente, incluir uma cláusula finally. Caso
nenhum bloco catch, seja executado o finally será
sempre executado
101
Jogando exceções
Paulo102
André Castro CE-703 / ITA
Estruturas de Dados no Java 2
Paulo103
André Castro CE-703 / ITA
Collection Interfaces
Paulo104
André Castro CE-703 / ITA
Duas Estruturas de Dados Muito
Úteis
Vector
Um array de Object de tamanho variável
Tempo para acessar um objeto é independente da sua posição na
lista
No jdk 1.2 ou superior, pode-se utilizar ArrayList
ArrayList não é sincronizado (thread-safe), por isso tende a ser
mais rápido
Hashtable
Armazena pares: nome-valor como Object
Valores não podem ser nulos
No jdk 1.2 ou superior, pode-se utilizar HashMap
HashMap não é sincronizado (thread-safe), por isso tende a ser
mais rápido
Paulo105
André Castro CE-703 / ITA
Métodos úteis em Vector
Paulo106
André Castro CE-703 / ITA
Utilizando Vector
Paulo107
André Castro CE-703 / ITA
Métodos úteis em Hashtable
Paulo108
André Castro CE-703 / ITA
Exemplo de Uso de um Hashtable
import java.util.Hashtable;
Paulo109
André Castro CE-703 / ITA
Resultado
>three = 3
Paulo110
André Castro CE-703 / ITA
Exemplo de Uso de uma Coleção
Vector
import java.util.Iterator;
import java.util.Vector;
Paulo112
André Castro CE-703 / ITA
Classes Genéricas no JDK 5.0
Classe genéricas: classes que podem ser parametrizadas
para trabalharem sobre classes específicas
Tipos parametrizáveis: (Design Patterns, GoF)
Templates: C++
Classes genéricas: Java,C#
Paulo113
André Castro CE-703 / ITA
Avanços em Collections no JDK 5.0
Coleções genéricas:
Vector<String> vetStrings=new Vector<String>();
Laços de Iteração Aprimorados
for(String element: vetStrings) {
System.out.println(element);
}
Paulo114
André Castro CE-703 / ITA
Exemplo de Uso de uma Coleção
Genérica
import java.util.Vector;
Paulo115
André Castro CE-703 / ITA
Resultado
>Linha 1
Linha 2
Linha 3
Linha 4
Linha 5
Paulo116
André Castro CE-703 / ITA
HashTable Genérico
import java.util.Hashtable;
Paulo117
André Castro CE-703 / ITA
Resultado
>three = 3
Paulo118
André Castro CE-703 / ITA
Classes Wrapper
Todo tipo primitivo em Java, tem uma classe
correspondente que pode encapsula-lo
119
Uso de Classes Wrapper
Define constantes úteis, por exemplo:
120
Outras conversões...
Paulo121
André Castro CE-703 / ITA
Resumindo...
Laços de repetição, comandos condicionais e o acesso a
arrays é feito em Java da mesma forma que em C++
String é uma classe em Java, não um array de caracteres
Nunca compare Strings usando ==
O tratamento de erros é feito através de exceções
(blocos try-catch-finally)
Vector, ArrayList e HashMap são estruturas de dados
muito úteis disponíveis em Java
Podem manter um número arbitrário de elementos
Paulo122
André Castro CE-703 / ITA
Mais sobre modificadores
(métodos e variáveis)
public: o método ou variável ao qual se refere é acessível
de “qualquer lugar” no código
Uma classe deve ser declarada public para ser acessível por
outras classes
Uma classe pública deve estar declarada num arquivo com o
mesmo nome da classe. Ex. “ public class Ship ...” deve estar no
arquivo Ship.java
private: O método ou variável ao qual se refere é
acessível exclusivamente por métodos da mesma classe
Declarar uma variável private a faz acessível pelo resto do código
apenas através de métodos públicos
Paulo123
André Castro CE-703 / ITA
Mais sobre modificadores
(métodos e variáveis)
protected: Acessível apenas a variáveis e métodos da
classe, das classes filhas (herdadas) e das classes que
pertencem ao mesmo pacote
Variáveis e métodos protected são herdados mesmo por classes
que não pertencem ao mesmo pacote
[default]: Similar ao protected, exceto por:
Variáveis e métodos [default] NÃO são herdados por classes que
não pertencem ao mesmo pacote
Em outras palavras: Variáveis e métodos [default] são herdadas
APENAS por classes que pertencem ao mesmo pacote
Paulo124
André Castro CE-703 / ITA
Exemplo - protected
Paulo125
André Castro CE-703 / ITA
Exemplo – [default]
Paulo126
André Castro CE-703 / ITA
Sumário de modificadores de acesso
Paulo127
André Castro CE-703 / ITA
Outros modificadores
Paulo128
André Castro CE-703 / ITA
Algumas Diretrizes para gerar
bom código
Uma classe deve o menor número possível de métodos
públicos (mas deve ter pelo menos um!)
Isto diminui o acoplamento entre as classes do projeto, o que
facilita a manutenção
Deve-se evitar variáveis públicas. Crie métodos de acesso
get/set. Exemplo:
Class Ship {
private double speed;
public double getSpeed() { return speed; }
public void setSpeed(double speed) {
this.speed=speed;}
}
Paulo129
André Castro CE-703 / ITA
Formatando
Números
Texto
Use DecimalFormat para formatação
Nas versões mais novas, Java implementa um método printf,
semelhante ao C/C++
Abordagem DecimalFormat
1. Crie um objeto DecimalFormat descrevendo a formatação
DecimalFormat formatter= new DecimalFormat(“#,###.##”);
2. Utilize o método de instância format para convertar valores
em string formatadas
formatter.format(24.99);
130
Formatando Números
Paulo131
André Castro CE-703 / ITA
Exemplo – Formatação de Números
Paulo132
André Castro CE-703 / ITA
Resultado – Formatando Números
Paulo133
André Castro CE-703 / ITA
Trabalhando com Datas
Classe Date
Vários métodos deprecated!
Classe Calendar
Uso: Calendar cal=Calendar.getInstance();
cal.setTime(new Date());
Date hoje=cal.getTime();
cal.setTime(int year,int month,int day, int hour,int minute,int second);
cal.set(Calendar.MONTH,Calendar.SEPTEMBER);
Paulo134
André Castro CE-703 / ITA
Formatando datas
/** @param Data a ser formatada
@return Data formatada em texto DD/MM/YY
*/
public static String FormatDate_UK(Date d) {
return
DateFormat.getDateInstance(DateFormat.SHORT,
Locale.UK).format(d);
}
/** @param Data a ser formatada
@return Data formatada em texto MM/DD/YY
*/
public static String FormatDate_USA(Date d) {
return
DateFormat.getDateInstance(DateFormat.SHORT,
Locale.US).format(d);
}
Paulo135
André Castro CE-703 / ITA
Formatando datas
/** @param Data a ser formatada
@return Data formatada em texto corrido na
língua do computador
*/
public static String FormatDate_Default(Date d)
{
return
DateFormat.getDateInstance(DateFormat.LONG,
Locale.getDefault()).format(d);
}
Em computador configurado para português (br):
Retorna: 31 de Outubro de 2006
Paulo136
André Castro CE-703 / ITA
Formatando datas – Abordagem
Direta
public static String FormatDate(Date d) {
if(d==null)
return new String("");
Calendar cal=Calendar.getInstance();
cal.setTime(d);
String year=Integer.toString(cal.get(Calendar.YEAR));
String month=Integer.toString(cal.get(Calendar.MONTH)+1);
String day=Integer.toString(cal.get(Calendar.DAY_OF_MONTH));
String hour=Integer.toString(cal.get(Calendar.HOUR_OF_DAY));
String minute=Integer.toString(cal.get(Calendar.MINUTE));
String second=Integer.toString(cal.get(Calendar.SECOND));
if(month.length()<2)
month="0"+month;
if(day.length()<2)
day="0"+day;
if(hour.length()<2)
hour="0"+hour;
if(minute.length()<2)
minute="0"+minute;
if(second.length()<2)
second="0"+second;
Paulo137
André Castro CE-703 / ITA
Criando datas
public static Date getDate
(int year,int month,int day) {
Calendar cal=Calendar.getInstance();
cal.set(year,month,day,0,0,0);
return cal.getTime();
}
Paulo138
André Castro CE-703 / ITA
Programa de Testes de Data
System.out.println("FormatDate_UK:
"+DatasTest.FormatDate_UK(hoje));
System.out.println("FormatDate_USA:
"+DatasTest.FormatDate_USA(hoje));
System.out.println("FormatDate_Default:
"+DatasTest.FormatDate_Default(hoje));
Date outroDia=getDate(2007,4,16); // mes inicia em zero
System.out.println("FormatDate_Default:
"+DatasTest.FormatDate_Default(outroDia));
}
}
Paulo139
André Castro CE-703 / ITA
Resultado
FormatDate_UK: 16/04/07
FormatDate_USA: 4/16/07
FormatDate_Default: 16 de Abril de 2007
FormatDate_Default: 16 de Maio de 2007
Paulo140
André Castro CE-703 / ITA
Calendar
Adiantando ou atrasando datas
cal.add(10,Calendar.MONTH)
cal.add(-15,Calendar.YEAR)
Pode-se utilizar GregorianCalendar (subclasse de Calendar)
para adiantar ou movimentar datas
GregorianCalendar gcal=new GregorianCalendar();
Acessando campos de uma data
cal.get(Calendar.MONTH) //retorna inteiro
cal.get(Calendar.SECONDS)
Paulo141
André Castro CE-703 / ITA
Sumário de Hoje
Introdução ao Ambiente Eclipse
Criando workspaces e projetos
Compilando e executando programas
Desenvolvimento de Programas básicos (modo texto)
Primeiros Programas
Javadoc, Os conceitos de CLASSPATH, package e import
Formatando texto
Paulo142
André Castro CE-703 / ITA
O sistema de IO em Java
A biblioteca java.io tem mais de 60 classes(stream) de
input/output
Dois grandes grupos
Classes baseadas em tráfego de bytes
DataStreams:
Classes baseados em tráfego de caracteres
Reader e Writer
Em qualquer operação de IO pode ocorrer uma exceção
do tipo IOException
Paulo143
André Castro CE-703 / ITA
A classe File
Paulo144
André Castro CE-703 / ITA
Métodos úteis em File
Paulo145
André Castro CE-703 / ITA
Exemplo de File:
Programa que lista o diretório do usuário
Paulo146
André Castro CE-703 / ITA
Resultado
Paulo147
André Castro CE-703 / ITA
Exercício: Listar o conteúdo de
um diretório
Faça um programa em Java que liste o conteúdo de um
diretório passado na linha de comando ou o diretório
corrente, caso não seja solicitado nenhum
Exemplos de uso:
C:>eclipse\ java ListDir “c:\Arquivos de Programa”
Lista o conteúdo do diretório Arquivos de Programa
C:>eclipse\java ListDir
Lista o conteúdo do diretório eclipse:
Paulo148
André Castro CE-703 / ITA
Solução
import java.io.*;
if(args.length<1) {
args=new String[2];
args[0]=System.getProperty("user.dir");
}
File dir = new File(args[0]);
if(dir.isDirectory()) {
String []list= dir.list();
for(int i=0;i<list.length;i++)
System.out.println("\t"+list[i]);
}
else
System.out.println(args[0]+" não é um diretorio");
}
}149
Paulo André Castro CE-703 / ITA
Resultado
Paulo150
André Castro CE-703 / ITA
Classes para escrever Texto
Paulo151
André Castro CE-703 / ITA
Classes para escrever Texto
Paulo152
André Castro CE-703 / ITA
Exemplo de Escrita de Arquivo de
Texto
Paulo153
André Castro CE-703 / ITA
Codificação de caracteres
Paulo154
André Castro CE-703 / ITA
Classes de Leitura de Streams de
Texto
Paulo155
André Castro CE-703 / ITA
UCS Transformation Format – UTF 8
Paulo156
André Castro CE-703 / ITA
Exemplo - FileReader
Paulo157
André Castro CE-703 / ITA
Resultado - FileReader
Paulo158
André Castro CE-703 / ITA
I/O em Arquivos (Streams) Binários
Paulo159
André Castro CE-703 / ITA
Classes para Escrita em Streams
Binárias
Paulo160
André Castro CE-703 / ITA
Classes para Escrita em Streams
Binárias
Paulo161
André Castro CE-703 / ITA
Exemplo – Escrita em Arquivos
Binários
Paulo162
André Castro CE-703 / ITA
Classes para Leitura em Streams
Binárias
Paulo163
André Castro CE-703 / ITA
Classes para Leitura em Streams
Binárias
Paulo164
André Castro CE-703 / ITA
Exemplo – Leitura de Arquivos
Binários
Paulo165
André Castro CE-703 / ITA
Resumo
Um objeto File pode referir-se tanto a um arquivo quanto a um
diretório
Use classes Reader/Writer para lidar com streams baseadas em
caracteres
Para ler linhas use BufferedReader
Use classes de formatação para a formatação de texto (Ex.
DecimalFormat, package java.text)
Use classes DataStream para lidar com streams baseadas em bytes.
Associe um FileOutputStream a um DataOutputSteam para escrever
em arquivos binários tipos básicos do Java
Associe um FileInputStream a um DataInputStream para ler de arquivos
binários usando tipos básicos do Java
Para ler ou escrever objetos em streams deve-se fazer uso das classes
ObjectOutputStream e ObjectInputStream.
Paulo166
André Castro CE-703 / ITA
Introdução a Ambientes de
Desenvolvimento Integrado
Sumário de Hoje
Introdução ao Ambiente Eclipse
Criando workspaces e projetos
Compilando e executando programas
Desenvolvimento de Programas básicos (modo texto)
Os conceitos de CLASSPATH, package e import
Formatando texto
Paulo168
André Castro CE-703 / ITA
Eclipse IDE
Paulo169
André Castro CE-703 / ITA
Criando Workspace
Paulo170
André Castro CE-703 / ITA
Criando projetos
Menu File | New | Project
Java Project
A partir de código pré-
existente arquivos ant
CVS
Java
Java Project
Java Project from ..Ant
Plug-In Development
171
Criando Projetos – Passo 2
Escolha
Nome do Projeto
Projeto vazio ou criado a
partir de código pré-
existente
JDK alvo
Project Layout
172
Configuração do Projeto
Escolha dos diretórios
com código-fonte
Bibliotecas utilizadas
Projetos requeridos
Ordem de
importação/exportação
173
Opções de Projeto
Criação de
elementos do Projeto
Classes, interfaces, etc.
Refactoring
Propriedades,etc.
174
Propriedades do Projeto
Configuração do
Classpath e acesso a
bibliotecas
Configuração de
diretórios de destino e
fonte
Configuração de destino
do Javadoc
Referências a outros
projetos, etc.
175
Alguns Exemplos de Programas
Paulo176
André Castro CE-703 / ITA
Alguns Exemplos de Programa
Exemplo 1:
public class Hello {
public static void main(String args[])
{ System.out.println(“Hello World!”);
}
}
Compile e Execute o programa acima através do Eclipse
Paulo177
André Castro CE-703 / ITA
Exemplo 2
Paulo178
André Castro CE-703 / ITA
Inserindo argumentos para os
programas através do Eclipse
Paulo179
André Castro CE-703 / ITA
Exemplo 3 – Usando Loops
Paulo180
André Castro CE-703 / ITA
Exemplo 4 – Loops Aninhados
Paulo181
André Castro CE-703 / ITA
Exemplo 5
Paulo182
André Castro CE-703 / ITA
Exemplo 5
Paulo183
André Castro CE-703 / ITA
Saída do Exemplo 5
Paulo184
André Castro CE-703 / ITA
Onde estão as classes ? CLASSPATH
Paulo185
André Castro CE-703 / ITA
Pacotes...
Paulo186
André Castro CE-703 / ITA
Pacotes...
Paulo187
André Castro CE-703 / ITA
Exercício
Criar packages hello, triangle, showArgs e ship
Mover programas correspondentes
Definir variáveis de instância de Ship como private e criar
métodos de acesso
Paulo188
André Castro CE-703 / ITA
Exercício 1
Crie um programa que armazene uma lista de
Funcionários (name,salary,hireDay) criados
“manualmente” em um arquivo texto
Leia este arquivo texto, atualizando a lista em memória e
Liste na tela os dados dos funcionários lidos
Use no mínimo duas classes: DataFileTest e Employee
Formato do registro:
[name] | [salary] | [year] | [month] | [day]
Utilizar StringTokenizer para separar campos
StringTokenizer t=new StringTokenizer(str,”|”);
String s=t.nextToken();
Paulo189
André Castro CE-703 / ITA
Exercício 1.1
Crie um método em Employee que incrementa o salário
de um funcionario pelo percentual passado como
parâmetro. Após a leitura dos dados do arquivo aumente
o salário de todos em 10%. Apresente os dados
Paulo190
André Castro CE-703 / ITA
Solução – Exercício 1 – Classe
DataFileTest
public static void main(String[] args)
public class DataFileTest { Employee[] staff = new Employee[3];
{ static void writeData(Employee[] e, PrintWriter os) staff[0] = new Employee("Harry Hacker", 35500,
Format.getDate(1989,10,1));
throws IOException
staff[1] = new Employee("Carl Cracker", 75000,
{ os.println(e.length);
Format.getDate(1987,12,15));
staff[2] = new Employee("Tony Tester", 38000,
int i; Format.getDate(1990,3,15));
for (i = 0; i < e.length; i++) try
e[i].writeData(os); { PrintWriter os = new PrintWriter(new
} FileWriter("employee.dat"));
writeData(staff, os); os.close();
} catch(IOException e)
static Employee[] readData(BufferedReader is)
{ System.out.print("Error: " + e);
throws IOException
System.exit(1); }
{ int n = Integer.parseInt(is.readLine()); try
Employee[] e = new Employee[n]; { BufferedReader is = new BufferedReader(new
int i; FileReader("employee.dat"));
for (i = 0; i < n; i++) Employee[] in = readData(is);
{ e[i] = new Employee(); for (i = 0; i < in.length; i++) in[i].print();
e[i].readData(is); is.close();
} catch(IOException e)
}
{ System.out.print("Error: " + e); System.exit(1); } }}
return e;
}
Paulo191
André Castro CE-703 / ITA
class Employee public void writeData(PrintWriter os) throws IOException
{ os.print(name+ "|");
{ public Employee(String n, double s, Date d)
os.print( salary+ "|");
{ name = n;
os.print(Format.getYear(hireDay)+ "|");
salary = s; os.print(Format.getMonth(hireDay)+ "|");
hireDay = d; os.print(Format.getDayofMonth(hireDay)+ "\n");
} }
public Employee() {}
public void print() public void readData(BufferedReader is) throws IOException
{ System.out.println(name + " " + salary { String s = is.readLine();
StringTokenizer t = new StringTokenizer(s, "|");
+ " " + hireYear());
name = t.nextToken();
}
salary = Double.parseDouble(t.nextToken());
public void raiseSalary(double byPercent) int y = Integer.parseInt(t.nextToken());
{ salary *= 1 + byPercent / 100; int m = Integer.parseInt(t.nextToken());
} int d = Integer.parseInt(t.nextToken());
public int hireYear() hireDay = Format.getDate(y,m,d);
{ return Format.getYear(hireDay); }
}
private String name;
private double salary;
private Date hireDay;
}
Paulo192
André Castro CE-703 / ITA
Solução 1.1
Na classe DataFileTest
public void raiseSalary(Employee[] e) {
int i;
for (i = 0; i < staff.length; i++)
staff[i].raiseSalary(10.0);
}
Na classe Employee,
public void raiseSalary(double byPercent)
{ salary *= 1 + byPercent / 100;
}
Paulo193
André Castro CE-703 / ITA
Exercício 2 – Opcional/Homework
Refaça o exercício 1, agora acessando arquivos binários
através da classe RandomAccessFile:
Crie um programa que armazene uma lista de
Funcionários (name,salary,hireDay) criados
“manualmente” e grave estes objetos em um arquivo Leia
o arquivo de dados, atualizando a lista em memória e
Liste na tela os dados dos funcionários lidos
Use no mínimo duas classes: ObjectFileTest e Employee
Paulo194
André Castro CE-703 / ITA
Multitarefa
Multithreading
Sumário
5.2.1 Introdução
5.2.2 Estados de um Thread: Ciclo de vida de um Thread
5.2..3 Prioridades de Thread Priorities and Thread Scheduling
5.2.4 Creating and Executing Threads
5.2.5 Thread Synchronization
5.2.6 Producer/Consumer Relationship without Synchronization
5.2.7 Producer/Consumer Relationship with Synchronization
5.2.8 Daemon Threads
5.2.9 Runnable Interface
start
Ready
thread dispatch
quantum expiration (assign a
timeout expires yield processor)
I/O completes
acquire lock
interrupt
interrupt
notifyAll
notify
Running
Thread.MAX_PRIORITY Priority 10 A B
Priority 9 C
Priority 8
Priority 7 D E F
Priority 6 G
Thread.NORM_PRIORITY Priority 5 H I
Priority 4
Priority 3
Priority 2 J K
Thread.MIN_PRIORITY Priority 1
Starting threads
Threads started, main ends
Producer writes 1
Producer writes 2
Consumer reads 2
Producer writes 3
Consumer reads 3
Producer writes 4
Producer done producing.
Terminating Producer.
Consumer reads 4
Consumer reads 4
Consumer read values totaling: 13.
Terminating Consumer.
Producer writes 1
Consumer reads 1
Producer writes 2
Consumer reads 2
Producer writes 3
Consumer reads 3
Producer writes 4
Producer done producing.
Terminating Producer.
Consumer reads 4
Consumer read values totaling: 10.
Terminating Consumer.
1 // Buffer.java
2 // Buffer interface specifies methods called by Producer and Consumer.
3
4 public interface Buffer {
5 public void set( int value ); // place value into Buffer
6 public int get(); // return value from Buffer
7 }
1 // Fig. 5.2.5: Producer.java
2 // Producer's run method controls a thread that
3 // stores values from 1 to 4 in sharedLocation.
4
Producer extends
5 public class Producer extends Thread {
Thread
6 private Buffer sharedLocation; // reference to shared object
7 This is a shared object
8 // constructor
9 public Producer( Buffer shared )
10 {
11 super(
super( "Producer" );
12 sharedLocation = shared;
13 }
Method run is overridden
14
15 // store values from 1 to 4 in sharedLocation
16 public void run()
17 {
18 for ( int count = 1; count <= 4; count++ ) {
The thread goes to sleep,
19 int sum=0;
then the buffer is set
20 // sleep 0 to 3 seconds, then place value in Buffer
21 try {
22 Thread.sleep( ( int ) ( Math.random() * 3001 ) ); sum+=count;
23 sharedLocation.set( count );
24 }
25
26 // if sleeping thread interrupted, print stack trace
27 catch ( InterruptedException exception ) {
28 exception.printStackTrace();
29 }
30
31 } // end for
32
33 System.err.println( getName() + " done producing totaling “+sum +
34 "\nTerminating " + getName() + ".");
".");
35
36 } // end method run
37
38 } // end class Producer
1 // Fig. 5.2.6: Consumer.java
2 // Consumer's run method controls a thread that loops four
3 // times and reads a value from sharedLocation each time.
4
Consumer extends
5 public class Consumer extends Thread {
Thread
6 private Buffer sharedLocation; // reference to shared object
7 This is a shared object
8 // constructor
9 public Consumer( Buffer shared )
10 {
11 super(
super( "Consumer" );
12 sharedLocation = shared;
13 }
Method run is overridden
14
15 // read sharedLocation's value four times and sum the values
16 public void run()
17 {
18 int sum = 0;
19
20 for ( int count = 1; count <= 4; count++ ) { The thread goes to sleep,
21 then the buffer is read
22 // sleep 0 to 3 seconds, read value from Buffer and add to sum
23 try {
24 Thread.sleep( ( int ) ( Math.random() * 3001 ) );
25 sum += sharedLocation.get();
26 }
27
28 // if sleeping thread interrupted, print stack trace
29 catch ( InterruptedException exception ) {
30 exception.printStackTrace();
31 }
32 }
33
34 System.err.println( getName() + " read values totaling: " + sum +
35 ".\
".\nTerminating " + getName() + ".");
".");
36
37 } // end method run
38
39 } // end class Consumer
1 // UnsynchronizedBuffer.java
2 // UnsynchronizedBuffer represents a single shared integer.
3 This class implements the
4 public class UnsynchronizedBuffer implements Buffer { Buffer interface
5 private int buffer = -1; // shared by producer and consumer threads
6 The data is a single integer
7 // place value into buffer
8 public void set( int value )
This method sets the value
9 {
in the buffer
10 System.err.println( Thread.currentThread().getName() +
11 " writes " + value );
12
13 buffer = value;
14 }
15
16 // return value from buffer This method reads the
17 public int get() value in the buffer
18 {
19 System.err.println( Thread.currentThread().getName() +
20 " reads " + buffer );
21
22 return buffer;
23 }
24
25 } // end class UnsynchronizedBuffer
1 // SharedBufferTest.java
2 // SharedBufferTest creates producer and consumer threads.
3
4 public class SharedBufferTest {
5
6 public static void main( String [] args )
7 {
Create a Buffer object
8 // create shared object used by threads
9 Buffer sharedLocation = new UnsynchronizedBuffer();
10 Create a Producer and a
11 // create producer and consumer objects Consumer
12 Producer producer = new Producer( sharedLocation );
13 Consumer consumer = new Consumer( sharedLocation ); Start the Producer and
14 Consumer threads
15 producer.start(); // start producer thread
16 consumer.start(); // start consumer thread
17
18 } // end main
19
20 } // end class SharedCell
5.2.7 Producer/Consumer Relationship
with Synchronization
Synchronize threads to ensure correct data
Exemplo Sincronizado: SynchronizedBuffer
Producer writes 1 1 1
Consumer reads 1 1 0
Producer writes 2 2 1
Consumer reads 2 2 0
Producer writes 3 3 1
Consumer reads 3 3 0
Producer writes 4 4 1
Consumer reads 4 4 0
Producer done producing.
Terminating Producer.
Initial State -1 0
Producer writes 1 1 1
Consumer reads 1 1 0
Producer writes 2 2 1
Producer tries to write.
Buffer full. Producer waits. 2 1
Consumer reads 2 2 0
Producer writes 3 3 1
Consumer reads 3 3 0
Producer writes 4 4 1
Initial State -1 0
Producer writes 1 1 1
Consumer reads 1 1 0
Producer writes 2 2 1
Consumer reads 2 2 0
Producer writes 3 3 1
Consumer reads 3 3 0
Producer writes 4 4 1