Escolar Documentos
Profissional Documentos
Cultura Documentos
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