programação concorrente - curso completo
TRANSCRIPT
PROGRAMAÇÃO CONCORRENTE – Prof. Thomás da Costa
APRESENTAÇÃO
• MBA em Arquitetura de Soluções pela FIAP.• Graduado em Gestão em Tecnologia da Informação pela UNIP.• 20 anos de experiência na área de Informática.• 15 anos de experiência com desenvolvimento em Java.• Sun Certified Programmer for the Java Platform (SCJP).• Desenvolvimento e arquitetura de aplicações em várias áreas.• Experiência profissional com várias linguagens e ferramentas de
desenvolvimento Java.• Atualmente envolvido em projetos com BigData e FastData.
Prof. Thomás da Costa
PROGRAMAÇÃO CONCORRENTE – Prof. Thomás da Costa
APRESENTAÇÃO
https://www.facebook.com/ProfThomasDaCosta
https://br.linkedin.com/in/thomasdacosta
http://pt.slideshare.net/thomasdacosta
https://github.com/thomasdacosta
Prof. Thomás da Costa
https://professorthomasdacosta.wordpress.com
PROGRAMAÇÃO CONCORRENTE – Prof. Thomás da Costa
Avaliação
APRESENTAÇÃO
• Média para Aprovação: 6,0 PONTOS.• Arredondamento: uma casa decimal (5,85 = 5,9).• Prova substitutiva substitui a nota da B2.• Frequência: mínimo 75%, abaixo disso REPROVA.• Lista de Presença: TEREMOS CHAMADA.
PROGRAMAÇÃO CONCORRENTE – Prof. Thomás da Costa
APRESENTAÇÃO
Média
70% Prova Obrigatória
30% Trabalho
70% Prova Obrigatória
30% Trabalho
PROGRAMAÇÃO CONCORRENTE – Prof. Thomás da Costa
APRESENTAÇÃO
Avaliação• Avaliação B1
• Trabalho em Grupo (máximo 5 pessoas)• 3,0 PONTOS.• TEMA DO TRABALHO:
• Lista de exercícios.• Será encaminhada para o representante de sala.
• Data de Entrega Final: Dia da Prova.• Após essa data o trabalho vale 1,5 PONTO.
• Prova• 7,0 PONTOS.
PROGRAMAÇÃO CONCORRENTE – Prof. Thomás da Costa
APRESENTAÇÃO
Avaliação• Avaliação B2
• Trabalho Individual• 3,0 PONTOS.• TEMA DO TRABALHO:
• Lista de exercícios.• Será encaminhada para o representante de sala.
• Data de Entrega Final: Dia da Prova.• Após essa data o trabalho vale 1,5 PONTO.
• Prova• 7,0 PONTOS.
PROGRAMAÇÃO CONCORRENTE – Prof. Thomás da Costa
APRESENTAÇÃO
• Horário de Aula: 19h10 – 20h50 e 21h10 – 22h00.• Celulares desligados, atendam fora da sala caso precisem.• Controlem as conversas paralelas !!!• Controle o WhatsApp e os jogos !!! • A todos estarei a disposição para tirar dúvidas !!!!• Vamos ter uma aula animada.• Participação de todos na aula.• É uma disciplina complexa, por isso mantenha a atenção.
Avisos
Estou aqui para fazer uma excelente aula e prepará-los para o mercado de trabalho
PROGRAMAÇÃO CONCORRENTE – Prof. Thomás da Costa
APRESENTAÇÃO
• Vamos estudar os princípios básicos.• Programação simultânea.• Execução de threads.• Processos computacionais paralelos.• Dias atuais os sistemas processam informações paralelas.• Os sistemas possuem controle dos processamentos.• Quantidade alta de usuários simultâneos.
O que é Programação Concorrente?Mundo simultâneo:
PROGRAMAÇÃO CONCORRENTE – Prof. Thomás da Costa
APRESENTAÇÃO
Vamos pensar:• Em uma única conta corrente podemos ter vários acessos simultâneos?• Como controlamos o acesso as informações para que o saldo se mantenha
correto no final da operação?
Em Programação Concorrente vamos entender o funcionamento de processos computacionais simultâneos.
O que é Programação Concorrente?
PROGRAMAÇÃO CONCORRENTE – Prof. Thomás da Costa
APRESENTAÇÃO
• Conceitos básicos.• Processos concorrentes.• Sincronização.• Semáforos.
O que vamos aprenderOnde tudo começa:
Vamos ver o PEA. !!!
PROGRAMAÇÃO CONCORRENTE – Prof. Thomás da Costa
APRESENTAÇÃO
PEAConceitos básicos de sistemas operacionais e multiprogramação.
Tipos de sistemas operacionais. Linguagens para programação concorrente;
Conceitos de Interrupção.
Processos concorrentes.
Sincronização.
Deadlocks.
Multithreading, controle e sincronização.
Tratamento de sinais.
Mecanismos de IPC (Inter Process Comunication)
Semáforos.
Memória compartilhada.
PROGRAMAÇÃO CONCORRENTE – Prof. Thomás da Costa
APRESENTAÇÃO
• Conteúdo da aula nos seguintes sites:
https://professorthomasdacosta.wordpress.com/
https://www.facebook.com/ProfThomasDaCosta/
http://pt.slideshare.net/thomasdacosta/presentations
• Será disponibilizado 1 dia depois da aula.• Não esqueçam de sempre baixar o material da aula quando
disponibilizado.• Siga os sites acima e a página do Facebook para ficar atualizado sobre o
material e outros assuntos relacionados a tecnologia.• Aula totalmente teórica, não utilizaremos de laboratório durante o curso.• E-mail do Professor: [email protected]
Material da Aula
PROGRAMAÇÃO CONCORRENTE – Prof. Thomás da Costa
APRESENTAÇÃO
Bibliografias UtilizadasTANENBAUM, Andrew S; STEEN, Maarten Van. Sistemas distribuídos: princípios e paradigmas. 2ª ed. São Paulo: Pearson - Prentice Hall, 2010.
PROGRAMAÇÃO CONCORRENTE – Prof. Thomás da Costa
APRESENTAÇÃO
Vamos iniciar nosso curso !!!
Na próxima aula !!!
PROGRAMAÇÃO CONCORRENTE – Prof. Thomás da Costa
A TECNOLOGIA JAVA
SISTEMAS OPERACIONAIS
PROGRAMAÇÃO CONCORRENTE – Prof. Thomás da Costa
É um programa que controla as funcionalidades de um determinado hardware e executa um conjunto de softwares de acordo com o seu objetivo. Provê uma interface intuitiva para um determinado nível de usuário.
Sistema OperacionalO que é?:
SISTEMAS OPERACIONAIS
PROGRAMAÇÃO CONCORRENTE – Prof. Thomás da Costa
• Controlar recursos de hardware:• CPU.• Memória.• E/S.
• Controlar recursos de software:• Sistemas de Arquivos.• Processos.• Execução dos programas.
• Gerenciar os recursos da melhor forma possível.• Controle de usuários.• Possuem um Kernel.
Sistemas OperacionaisObjetivos:
SISTEMAS OPERACIONAIS
PROGRAMAÇÃO CONCORRENTE – Prof. Thomás da Costa
• São complexos.• Multiprogramação.• Possuem processos.• Executa vários programas simultâneos.• Processamento rápido mostra a impressão de execução ao mesmo tempo.• Sincronização entre processos.• Memória Virtual (Parece que a memória não tem fim !!!)• Embarcados.• Virtualizados.
Sistemas OperacionaisDias atuais:
SISTEMAS OPERACIONAIS
PROGRAMAÇÃO CONCORRENTE – Prof. Thomás da Costa
Em nossa disciplina, vamos estudar uma API de alto nível que utiliza de recursos do Sistema Operacional para trabalhar com vários processos simultâneos. Neste conjunto de API, possuímos funcionalidades para controlar os processos, iniciar, parar e sincroniza-los.
Detalhes:
SISTEMAS OPERACIONAIS
Sistemas Operacionais
PROGRAMAÇÃO CONCORRENTE – Prof. Thomás da Costa
SISTEMAS OPERACIONAIS
Sistemas Operacionais
PROGRAMAÇÃO CONCORRENTE – Prof. Thomás da Costa
A TECNOLOGIA JAVA
A TECNOLOGIA JAVA
PROGRAMAÇÃO CONCORRENTE – Prof. Thomás da Costa
• Originalmente criado para dispositivos embarcados.• Iniciou a partir Projeto Green em Junho de 1991 por James Gosling, Mike
Sheridan and Patrick Naughton.• Denominada inicialmente de Oak.• Desenvolvido por James Gosling na Sun Microsystems em 1995.• Em 1996 foi lançado a primeira versão do JDK 1.0.
• Premissas da Linguagem:• Sem ponteiros (todos ficamos felizes).• Independente de plataforma.• Recurso de garbage collector.• Alta confiabilidade.• Bytecodes.
HistóricoOrigens:
A TECNOLOGIA JAVA
PROGRAMAÇÃO CONCORRENTE – Prof. Thomás da Costa
A TECNOLOGIA JAVA
Fonte: http://viralpatel.net/blogs/java-virtual-machine-an-inside-story/
PROGRAMAÇÃO CONCORRENTE – Prof. Thomás da Costa
Tem como principal funcionalidade executar os bytecodes gerado a partir dos códigos Java, tornando a linguagem independente de plataforma. Além disso a JVM possui outras responsabilidades:
• Gerenciamento de memória.• Controle de threads.• Comunicação com o Sistema Operacional e acessar métodos nativos.• Pode executar outras linguagens além do Java como Groovy, Jython e JRuby.
JVMJava Virtual Machine:
A TECNOLOGIA JAVA
PROGRAMAÇÃO CONCORRENTE – Prof. Thomás da Costa
A TECNOLOGIA JAVA
Java Platform Standard Edition 7
Fonte: http://docs.oracle.com/javase/7/docs/index.html
PROGRAMAÇÃO CONCORRENTE – Prof. Thomás da Costa
• Funcionamento de um programa Java.• Variáveis.• Condicionais.• Laços.• Vetores.• String.• Não vamos entrar em detalhes na Orientação a Objetos.• Precisamos conhecer somente como instanciar uma classe para a nossa
disciplina.• E... Conhecer Lógica de Programação !!!
JavaO que vamos ver na revisão:
A TECNOLOGIA JAVA
Vamos começar !!!
PROGRAMAÇÃO CONCORRENTE – Prof. Thomás da Costa
Exemplo 01
package edu.anhanguera.poo.aula03; public class Exemplo01 {
public static void main(String[] args) {System.out.println("Olá Pessoal.
Tudo Bem?");}
}
PROGRAMAÇÃO CONCORRENTE – Prof. Thomás da Costa
package edu.anhanguera.poo.aula03; public class Exemplo02 {
public static void main(String[] args) {// É uma forma de criar comentários em linha.
System.out.println("Imprimindo na saida do console");System.err.println("Imprimindo na saida de erro do
console");System.out.print("Está forma não pula linha");System.err.format("Saida %s formatada", new
String("é"));System.out.format("Esta %s também é formatada", new
String("saida"));
// O método abaixo possui o conceito de varargsSystem.out.format("%s formatada %s vários %s",
new String("Saida"),
new String("com"),
new String("paramêtros"));
} }
Exemplo 02
PROGRAMAÇÃO CONCORRENTE – Prof. Thomás da Costa
package edu.anhanguera.poo.aula03; public class Exemplo03 {
public static void main(String[] args) {int varInt;double varDouble;float varFloat;long varLong;boolean varBoolean;byte varByte;short varShort;
varInt = 2015;varDouble = 768.35;varFloat = 3.14159265f;varLong = 250000000l;varBoolean = true;varByte = 8;varShort = 3;
System.out.println("int: " + varInt);System.out.println("double: " + varDouble);System.out.println("float: " + varFloat);System.out.println("long: " + varLong);System.out.println("boolean: " + varBoolean);System.out.println("byte: " + varByte);System.out.println("short: " + varShort);
} }
Exemplo 03
PROGRAMAÇÃO CONCORRENTE – Prof. Thomás da Costa
package edu.anhanguera.poo.aula03; public class Exemplo04 {
public static void main(String[] args) {double media = 0;double notaB1 = 5;double notaB2 = 6;
media = (notaB1 * 0.4) + (notaB2 * 0.6);
if (media >= 6) {System.out.println("Aprovado");
} else {System.out.println("Reprovado");
}
System.out.println(media >= 6 ? "Aprovado" : "Reprovado");
} }
Exemplo 04
PROGRAMAÇÃO CONCORRENTE – Prof. Thomás da Costa
package edu.anhanguera.poo.aula03; public class Exemplo05 {
public static void main(String[] args) {boolean ligar = true;if (ligar)
System.out.println("Ligado");
if (!ligar)System.out.println("Desligado");
float soma;float operador1 = 788.00f;float operador2 = 3.58f;
soma = operador1 + operador2;if (soma == 791.58f) {
System.out.println("Resultado da soma é " + soma);
}}
}
Exemplo 05
PROGRAMAÇÃO CONCORRENTE – Prof. Thomás da Costa
package edu.anhanguera.poo.aula03; public class Exemplo06 {
public static void main(String[] args) {String nomeGuerreiro = "Blackwall";String nomeMago = new String("Solas");
System.out.println("Guerreiro:" + nomeGuerreiro);System.out.println("Mago:" + nomeMago);System.out.println("Tamanho:" +
nomeGuerreiro.length());System.out.println("Tamanho:" + nomeMago.length());
if (!nomeGuerreiro.equals(nomeMago)) {System.out.println("Os nomes são
diferentes.");} else {
System.out.println("Os nomes são iguais.");}
nomeGuerreiro = nomeGuerreiro.toUpperCase();nomeMago = nomeMago.toLowerCase();
System.out.println("Guerreiro:" + nomeGuerreiro);System.out.println("Mago:" + nomeMago);
} }
Exemplo 06
PROGRAMAÇÃO CONCORRENTE – Prof. Thomás da Costa
package edu.anhanguera.poo.aula03; public class Exemplo07 {
public static void main(String[] args) {char linguagem[] = { 'J', 'a', 'v', 'a' };String java = "";
for (int i=0;i<=linguagem.length-1;i++) {java += linguagem[i];
}System.out.println("Linguagem " + java);
int notas[] = new int[2];notas[0] = 6;notas[1] = 7;
int i=0;while (i <= notas.length-1) {
System.out.println("Nota " + (i + 1) + ":" + notas[i]);
i++;}
boolean ligado = true;do {
System.out.println("Ligado");ligado = false;
} while (ligado);}
}
Exemplo 07
PROGRAMAÇÃO CONCORRENTE – Prof. Thomás da Costa
package edu.anhanguera.poo.aula03; public class Exemplo08 {
public static void main(String[] args) {Integer varInt = 2015;Double varDouble = 768.35;Float varFloat = 3.14159265f;Long varLong = 250000000l;Boolean varBoolean = true;Byte varByte = 8;Short varShort = 3;
System.out.println("int: " + varInt);System.out.println("double: " + varDouble);System.out.println("float: " + varFloat);System.out.println("long: " + varLong);System.out.println("boolean: " + varBoolean);System.out.println("byte: " + varByte);System.out.println("short: " + varShort);
String valor = "100";varInt = Integer.parseInt(valor);
System.out.println("Valor convertido:" + valor);
}
}
Exemplo 08
PROGRAMAÇÃO CONCORRENTE – Prof. Thomás da Costa
package edu.anhanguera.poo.aula03; import java.util.Scanner; public class Exemplo09 {
public static void main(String[] args) {double notaB1;double notaB2;double media;Scanner scanner = new Scanner(System.in);
System.out.println("Digite a nota da B1:");notaB1 = scanner.nextDouble();
System.out.println("Digite a média:");media = scanner.nextDouble();
notaB2 = (media - (notaB1*0.4)) / 0.6;System.out.println("Nota necessária para
aprovação:" + notaB2);
scanner.close();}
}
Exemplo 09
PROGRAMAÇÃO CONCORRENTE – Prof. Thomás da Costa
THREADS
THREADS
PROGRAMAÇÃO CONCORRENTE – Prof. Thomás da Costa
THREADS
ThreadsDetalhes:• No desenvolvimento de software, precisamos muitas vezes efetuar
operações paralelas.• Executando operações paralelas, nosso programa continua seu
processamento natural enquanto espera a conclusão de outras atividades.• Os processos paralelos podem ser definidos como um fluxo de controle
ativo dentro do nosso programa.
PROGRAMAÇÃO CONCORRENTE – Prof. Thomás da Costa
THREADS
Threads
Processo 1
Processo 2
Processo 3
Sem Threads
Processo 1
Processo 2
Processo 3
Programa Principal
Com Threads
PROGRAMAÇÃO CONCORRENTE – Prof. Thomás da Costa
ThreadsO que é?:
THREADS
É fluxo alternativo e ativo dentro do nosso programa que executa paralelamente com o software principal e outros fluxos. Possui um bloco de instruções ou comandos que serão executados.
PROGRAMAÇÃO CONCORRENTE – Prof. Thomás da Costa
ThreadsDetalhes:• Isso é a base de Programação Concorrente.• Conhecido como multiprogramação.• Boa parte das aplicações desenvolvidas nos dias atuais, utiliza de threads
para processamento de informações e melhoria de performance.• Tarefas podem ser paralelizadas em vários fluxos.• Tarefas podem ser distribuídas quando utilizamos threads.• Hoje grandes aplicações trabalham com threads, muitas delas distribuídas
em computadores diferentes.• São compostas por instruções de comandos de uma linguagem. No nosso
caso o Java.• Aproveitamos melhor os recursos de um sistema operacional.
THREADS
PROGRAMAÇÃO CONCORRENTE – Prof. Thomás da Costa
ThreadsDetalhes:
THREADS
• São conhecidas como processos leves.• Como foi dito, fazem parte do programa principal ou processo tradicional.• Possuem prioridades.• Podem possuir um identificador.• Podemos iniciar, parar ou colocar uma thread em espera.• São gerenciadas pelo sistema operacional.
PROGRAMAÇÃO CONCORRENTE – Prof. Thomás da Costa
ThreadsCiclo de Vida:
THREADS
Fonte: http://www3.ntu.edu.sg/home/ehchua/programming/java/j5e_multithreading.html
PROGRAMAÇÃO CONCORRENTE – Prof. Thomás da Costa
ThreadsCriando uma Thread:
THREADS
public class ExemploThread extends Thread {
@Overridepublic void run() {}
}
• Para criar uma Thread utilizamos a classe Thread.• As instruções de execução de uma Thread são desenvolvidas dentro do
método run().
Método que será executado pela ThreadClasse Thread
PROGRAMAÇÃO CONCORRENTE – Prof. Thomás da Costa
Exemplo 01package edu.anhanguera.prc.aula03; public class ExemploThread extends Thread {
@Overridepublic void run() {
System.out.println("Executando ExemploThread");}
public static void main(String[] args) {
ExemploThread exemploThread = new ExemploThread();
exemploThread.start();}
}
PROGRAMAÇÃO CONCORRENTE – Prof. Thomás da Costa
ThreadsDetalhes:• Neste modelo, utilizamos uma classe como herança.• Caso seja necessário utilizar outra classe como herança, podemos ter
problemas, pois o Java não possui herança múltipla.• Para iniciar uma Thread utilizamos o método start().
THREADS
PROGRAMAÇÃO CONCORRENTE – Prof. Thomás da Costa
ThreadsCriando uma Thread:
THREADS
• Podemos utilizar uma outra forma de criar uma Thread: utilizando a interface Runnable.
public class ExemploRunnable implements Runnable { public void run() {}
}
Método que será executado pela Thread
Interface Runnable
PROGRAMAÇÃO CONCORRENTE – Prof. Thomás da Costa
Exemplo 02package edu.anhanguera.prc.aula03; public class ExemploRunnable implements Runnable { public void run() {
System.out.println("Executando ExemploRunnable");}
public static void main(String[] args) {ExemploRunnable exemploRunnable = new
ExemploRunnable();
Thread thread = new Thread(exemploRunnable);thread.start();
} }
PROGRAMAÇÃO CONCORRENTE – Prof. Thomás da Costa
ThreadsDetalhes:• Neste modelo utilizamos uma interface.• Caso seja necessário utilizar outra classe como herança ou até mesmo uma
interface não teremos problemas.• Esta é a melhor forma de criar e utilizar Threads.• Precisamos instanciar a classe Thread e passar como argumento a classe
com a interface Runnable implementada.• Para iniciar uma Thread utilizamos o método start() da classe Thread.
THREADS
PROGRAMAÇÃO CONCORRENTE – Prof. Thomás da Costa
Exemplo 03
package edu.anhanguera.prc.aula03; import java.util.concurrent.ThreadLocalRandom; public class ExemploNumIntRandomico implements Runnable {
public static int parar = 0;
public void run() { while (parar == 0) {
int num = ThreadLocalRandom.current().nextInt(0, 9);System.out.println("Numero: " + num);try {
Thread.sleep(500);} catch (InterruptedException e) {}
}}
public static void main(String[] args) { ExemploNumIntRandomico numIntRandomico = new ExemploNumIntRandomico();
Thread thread = new Thread(numIntRandomico); thread.start();}
}
PROGRAMAÇÃO CONCORRENTE – Prof. Thomás da Costa
Threads
• O comando Thread.sleep é estático.• Sua principal função é deixar a Thread pausada ou adormecida durante um
período de tempo.• O parâmetro do método é a quantidade de milissegundos que a Thread
deve ficar adormecida.
THREADS
Detalhes:
PROGRAMAÇÃO CONCORRENTE – Prof. Thomás da Costa
Exemplo 04
package edu.anhanguera.prc.aula03; import java.util.concurrent.ThreadLocalRandom; public class ExemploNumDoubleRandomico implements Runnable {
public static int parar = 0;
public void run() {while (parar == 0) {
double num = ThreadLocalRandom.current().nextDouble(0, 9); System.out.println("Numero: " + num);
try { Thread.sleep(2000);
} catch (InterruptedException e) {}}
}
public static void main(String[] args) {ExemploNumDoubleRandomico randomico = new ExemploNumDoubleRandomico();
Thread thread = new Thread(randomico); thread.start();}
}
PROGRAMAÇÃO CONCORRENTE – Prof. Thomás da Costa
package edu.anhanguera.prc.aula03; public class ExemploNumerosRandomicos {
public static void main(String[] args) {ExemploNumDoubleRandomico doubleRandomico = new
ExemploNumDoubleRandomico();ExemploNumIntRandomico intRandomico = new ExemploNumIntRandomico();
Thread threadDouble = new Thread(doubleRandomico);threadDouble.start();
Thread threadInt = new Thread(intRandomico);threadInt.start();
try {Thread.sleep(10000);
ExemploNumDoubleRandomico.parar = 1;System.out.println("ExemploNumDoubleRandomico finalizado");
Thread.sleep(10000);ExemploNumIntRandomico.parar = 1;System.out.println("ExemploNumIntRandomico finalizado");
} catch (InterruptedException e) {}}
}
PROGRAMAÇÃO CONCORRENTE – Prof. Thomás da Costa
Resumo
• Threads são blocos de instruções que executam em paralelo ao programa principal.
• Ajudam na performance de um aplicação.• As Threads possuem um ciclo de vida.• Podemos utilizar a classe Thread ou a interface Runnable para implementar
uma Thread.
THREADS
PROGRAMAÇÃO CONCORRENTE – Prof. Thomás da Costa
SINCRONIZAÇÃO
SINCRONIZAÇÃO
PROGRAMAÇÃO CONCORRENTE – Prof. Thomás da Costa
SincronizaçãoDetalhes:• Em alguns programas, as threads utilizam informações compartilhadas.• As informações compartilhadas, normalmente são variáveis que possuem
algum valor.• Pode ser também algum trecho de código que modifica alguma informação
em varias variáveis ou em um local de armazenamento como um banco de dados.
• Por exemplo: • Em uma conta corrente temos o valor do saldo.• Normalmente quando ocorre o saque ou um depósito o valor final
deve permanecer correto.• Algumas vezes o saque e o depósito ocorrem ao mesmo tempo.• Se esse processo acontecer em threads separadas, podemos ter o valor
final alterado incorretamente.
SINCRONIZAÇÃO
PROGRAMAÇÃO CONCORRENTE – Prof. Thomás da Costa
SincronizaçãoDetalhes:• Para trabalhar com dados compartilhados e manter a sua integridade,
utilizamos um conceito conhecido como sincronização.• Duas threads utilizam da mesma informação mas cada uma espera a
execução de outra thread ser concluída.
SINCRONIZAÇÃO
Vamos ver um exemplo sem sincronização das informações.
PROGRAMAÇÃO CONCORRENTE – Prof. Thomás da Costa
package edu.anhanguera.prc.aula04; public class Sincronizacao01 extends Thread {
public static int contador = 0;
public void run() {for (int i=1;i<=10;i++)
incrementarContador();}
public void incrementarContador() {contador++;System.out.println(this.getName() + " - " + contador);try {
Thread.sleep(1000);} catch (InterruptedException e) {}
}
public static void main(String[] args) throws InterruptedException {Sincronizacao01 sinc1 = new Sincronizacao01();
Thread thread1 = new Thread(sinc1);thread1.start();
Thread thread2 = new Thread(sinc1);thread2.start();
} }
PROGRAMAÇÃO CONCORRENTE – Prof. Thomás da Costa
SINCRONIZAÇÃO
Resultado final incorreto. Deveria efetuar a contagem corretamente.
PROGRAMAÇÃO CONCORRENTE – Prof. Thomás da Costa
package edu.anhanguera.prc.aula04; public class Sincronizacao02 extends Thread {
public static int contador = 0;
public void run() {synchronized (this) {for (int i=1;i<=10;i++)incrementarContador();
}}
public void incrementarContador() {contador++;System.out.println(this.getName() + " - " + contador);try {
Thread.sleep(1000);} catch (InterruptedException e) {}
}
public static void main(String[] args) throws InterruptedException {Sincronizacao02 sinc1 = new Sincronizacao02();
Thread thread1 = new Thread(sinc1);thread1.start();
Thread thread2 = new Thread(sinc1);thread2.start();
} }
PROGRAMAÇÃO CONCORRENTE – Prof. Thomás da Costa
SINCRONIZAÇÃO
Contagem efetuada com sucesso. Valor final correto !!!
PROGRAMAÇÃO CONCORRENTE – Prof. Thomás da Costa
SincronizaçãoDetalhes:
SINCRONIZAÇÃO
• Foi utilizada a palavra reservada synchronized em um bloco de código.• Esta palavra efetua a sincronização de um método ou bloco de código.
PROGRAMAÇÃO CONCORRENTE – Prof. Thomás da Costa
SincronizaçãoOutro exemplo:
SINCRONIZAÇÃO
• Vamos ver um exemplo utilizando a lógica de uma conta corrente de um banco.
• Vamos demonstrar um programa efetuando vários depósitos em uma conta corrente.
PROGRAMAÇÃO CONCORRENTE – Prof. Thomás da Costa
package edu.anhanguera.prc.aula04; public class ContaCorrente {
public double saldo;
public ContaCorrente() {}
public void sacar(double valor) {if ((saldo-valor) <= 0) {
System.out.println("Saldo indisponivel: " + saldo);}saldo -= valor;
}
public void depositar(double valor) {saldo += valor;
} }
PROGRAMAÇÃO CONCORRENTE – Prof. Thomás da Costa
package edu.anhanguera.prc.aula04; public class BancoNaoSincronizado implements Runnable {
public ContaCorrente contaCorrente;
public void run() {for (int i=10;i<=100;i+=10) {contaCorrente.depositar(i);System.out.println("Saldo Atual:" + contaCorrente.saldo);try {
Thread.sleep(500);} catch (InterruptedException e) {
e.printStackTrace();}
}}
public static void main(String[] args) {ContaCorrente contaCorrente = new ContaCorrente();BancoNaoSincronizado banco = new BancoNaoSincronizado();banco.contaCorrente = contaCorrente;
Thread thread1 = new Thread(banco);thread1.start();
Thread thread2 = new Thread(banco);thread2.start();
Thread thread3 = new Thread(banco);thread3.start();
} }
PROGRAMAÇÃO CONCORRENTE – Prof. Thomás da Costa
SINCRONIZAÇÃO
Valor incorreto na conta corrente.
PROGRAMAÇÃO CONCORRENTE – Prof. Thomás da Costa
package edu.anhanguera.prc.aula04; public class BancoSincronizado implements Runnable {
public ContaCorrente contaCorrente;
public void run() {synchronized (contaCorrente) {for (int i=10;i<=100;i+=10) {contaCorrente.depositar(i);System.out.println("Saldo Atual:" + contaCorrente.saldo);try {
Thread.sleep(500);} catch (InterruptedException e) {
e.printStackTrace();}
}}}
public static void main(String[] args) {ContaCorrente contaCorrente = new ContaCorrente();
BancoSincronizado banco = new BancoSincronizado();banco.contaCorrente = contaCorrente;
Thread thread1 = new Thread(banco);thread1.start();
Thread thread2 = new Thread(banco);thread2.start();
Thread thread3 = new Thread(banco);thread3.start();
} }
PROGRAMAÇÃO CONCORRENTE – Prof. Thomás da Costa
SINCRONIZAÇÃO
Saldo correto !!
PROGRAMAÇÃO CONCORRENTE – Prof. Thomás da Costa
Resumo
• Uma thread pode utilizar informações compartilhadas.• Caso essas informações sejam sensíveis, alguns valores serão computados
incorretamente.• Para resolver este problema utilizamos a sincronização.• Utilizamos a palavra reservada synchronized para resolver o problema de
sincronização.
SINCRONIZAÇÃO
PROGRAMAÇÃO CONCORRENTE – Prof. Thomás da Costa
COMUNICAÇÃO ENTRE PROCESSOS
COMUNICAÇÃO ENTRE PROCESSOS
PROGRAMAÇÃO CONCORRENTE – Prof. Thomás da Costa
COMUNICAÇÃO ENTRE PROCESSOS
Comunicação Entre ProcessosO que é?:É a troca de informações ou mensagens entre programas, localizados no mesmo computador ou em computadores diferentes. Essa comunicação pode acontecer também em redes diferentes.
PROGRAMAÇÃO CONCORRENTE – Prof. Thomás da Costa
COMUNICAÇÃO ENTRE PROCESSOS
Comunicação Entre ProcessosTipos de comunicação que vamos estudar:• Arquivos compartilhados utilizando Serialização de objetos em Java.• Comunicação Socket via TCP/IP.
PROGRAMAÇÃO CONCORRENTE – Prof. Thomás da Costa
COMUNICAÇÃO ENTRE PROCESSOS
Arquivos CompartilhadosDetalhes:• Um arquivo fica localizado em um diretório.• Programas podem acessar este arquivo para compartilhar informações.• Vamos utilizar o conceito de serialização de classes em Java.• Neste processo, o arquivo contém os bytecodes de uma classe.• Para que ocorra a serialização, uma classe deve implementar a interface
Serializable.• A classe que implementa a interface Serializable é um POJO que possui
somente atributos com getter e setters.• Não vamos nos preocupar com acessos simultâneos no arquivo.
PROGRAMAÇÃO CONCORRENTE – Prof. Thomás da Costa
package edu.anhanguera.prc.aula05; import java.io.Serializable; public class Pessoa implements Serializable {
private static final long serialVersionUID = -8617059067424820303L;
private String nome;private int idade;private double altura;private double peso;
public Pessoa() {}
public String getNome() {
return nome;}
public void setNome(String nome) {
this.nome = nome;}
public int getIdade() {
return idade;}
public void setIdade(int idade) {
this.idade = idade;}
public double getAltura() {return altura;
}
public void setAltura(double altura) {
this.altura = altura;}
public double getPeso() {
return peso;}
public void setPeso(double peso) {
this.peso = peso;}
}
PROGRAMAÇÃO CONCORRENTE – Prof. Thomás da Costa
package edu.anhanguera.prc.aula05; import java.io.FileOutputStream;import java.io.ObjectOutputStream; public class SerializandoObjeto {
public static void main(String[] args) {Pessoa pessoa = new Pessoa();FileOutputStream fileOutputStream = null;ObjectOutputStream objectOutputStream = null;
try {pessoa.setAltura(1.75);pessoa.setIdade(31);pessoa.setNome("Bruce Wayne");pessoa.setPeso(85.45);
fileOutputStream = new FileOutputStream("/tmp/pessoa.obj");objectOutputStream = new ObjectOutputStream(fileOutputStream);objectOutputStream.writeObject(pessoa);
} catch (Exception e) {e.printStackTrace();
} finally {try {
fileOutputStream.close();objectOutputStream.close();
} catch (Exception e) {}}
}}
PROGRAMAÇÃO CONCORRENTE – Prof. Thomás da Costa
package edu.anhanguera.prc.aula05; import java.io.FileInputStream;import java.io.ObjectInputStream; public class DeserializandoObjeto {
public static void main(String[] args) {Pessoa pessoa = null;FileInputStream fileInputStream = null;ObjectInputStream objectInputStream = null;
try {fileInputStream = new FileInputStream("/tmp/pessoa.obj");objectInputStream = new ObjectInputStream(fileInputStream);
pessoa = (Pessoa) objectInputStream.readObject();
System.out.println(pessoa.getAltura());System.out.println(pessoa.getIdade());System.out.println(pessoa.getNome());System.out.println(pessoa.getPeso());
} catch (Exception e) {e.printStackTrace();
} finally {try {
fileInputStream.close();objectInputStream.close();
} catch (Exception e) {}}
}}
PROGRAMAÇÃO CONCORRENTE – Prof. Thomás da Costa
COMUNICAÇÃO ENTRE PROCESSOS
Arquivos CompartilhadosDetalhes:• Utilizamos a classe FileOutputStream para criar um arquivo em um
diretório.• A classe ObjectOutputStream grava o objeto Pessoa no arquivo
especificado.• Este processo acontece a Serialização do objeto.• Para Deserializar o objeto, utilizamos o FileInputStream para efetuar a
leitura do arquivo e ObjectInputStream para criar o objeto Pessoa.• É necessário efetuar um cast para o tipo especificado.
PROGRAMAÇÃO CONCORRENTE – Prof. Thomás da Costa
COMUNICAÇÃO ENTRE PROCESSOS
SocketsDetalhes:• Comunicação entre processos localizados normalmente em computadores
diferentes.• Utilizamos a rede para o envio de informações entre um processo e outro.• Esta comunicação acontece via TCP/IP.• É necessário conhecer o endereço e a porta do processo destino para que
ocorra a comunicação.• Existe uma padronização feita pelo cliente e servidor para que ocorra a
troca de informações.
PROGRAMAÇÃO CONCORRENTE – Prof. Thomás da Costa
package edu.anhanguera.prc.aula05; import java.io.IOException;import java.net.ServerSocket;import java.net.Socket; public class Servidor {
public static void main(String[] args) {ServerSocket servidor = null;try {
System.out.println("[SERVER] - Iniciando Servidor na porta 1234...");
servidor = new ServerSocket(1234);System.out.println("[SERVER] - Servidor Iniciado");
while (true) {System.out.println("[SERVER] - Aguardando conexão.");Socket cliente = servidor.accept();System.out.println("[SERVER] - Conexão Recebida de " +
cliente.getInetAddress().getHostAddress());ProcessamentoThread processThread = new
ProcessamentoThread();processThread.setSocket(cliente);Thread thread = new Thread(processThread);thread.start();System.out.println("[SERVER] - Thread de processamento em
execução.");}
} catch (IOException e) {e.printStackTrace();
} finally {try {
servidor.close();} catch (IOException e) {}
}}
}
PROGRAMAÇÃO CONCORRENTE – Prof. Thomás da Costa
COMUNICAÇÃO ENTRE PROCESSOS
SocketsDetalhes:• Neste exemplo, estamos criando uma comunicação cliente-servidor.• Utilizamos a classe ServerSocket para criar um servidor que irá receber
conexões de seus clientes.• Este servidor é executado na porta 1234.• Para cada conexão, criamos uma Thread para paralelizar o processamento
das informações.
PROGRAMAÇÃO CONCORRENTE – Prof. Thomás da Costa
package edu.anhanguera.prc.aula05; import java.io.IOException;import java.net.Socket;import java.util.Scanner; public class ProcessamentoThread implements Runnable {
private Socket cliente = null;
public void run() {System.out.println("[PROCESSO] - Executando processamento do cliente " +
cliente.getInetAddress().getHostAddress());Scanner scanner = null;try {
scanner = new Scanner(cliente.getInputStream());while (scanner.hasNextLine()) {
System.out.println("[PROCESSO] - Mensagem Recebida: " +
scanner.nextLine());}
} catch (IOException e) {e.printStackTrace();
} finally {scanner.close();
}}
public Socket getSocket() {
return cliente;}
public void setSocket(Socket socket) {
this.cliente = socket;}
}
PROGRAMAÇÃO CONCORRENTE – Prof. Thomás da Costa
package edu.anhanguera.prc.aula05; import java.io.IOException;import java.io.PrintStream;import java.net.Socket; import javax.swing.JOptionPane; public class Cliente {
public static void main(String[] args) {Socket servidor = null;try {
String mensagem = (String) JOptionPane.showInputDialog(null, "Escreva uma mensagem:",
"Mensagem do Cliente", JOptionPane.PLAIN_MESSAGE, null, null,
"escreva aqui");System.out.println("[CLIENT] - Conectando no servidor");servidor = new Socket("localhost", 1234);System.out.println("[CLIENT] - Conexão com sucesso !!!");
PrintStream printStream = new PrintStream(servidor.getOutputStream());
printStream.println(mensagem);
System.out.println("[CLIENT] - Mensagem enviada: " + mensagem);} catch (Exception e) {
e.printStackTrace();} finally {
try {servidor.close();
} catch (IOException e) {}}
}}
PROGRAMAÇÃO CONCORRENTE – Prof. Thomás da Costa
COMUNICAÇÃO ENTRE PROCESSOS
SocketsDetalhes:• O cliente informa o endereço e a porta do servidor para efetuar a conexão.• Nosso cliente envia uma informação através de uma caixa de dialogo.• O servidor imprime a informação enviada pelo cliente.
PROGRAMAÇÃO CONCORRENTE – Prof. Thomás da Costa
COMUNICAÇÃO ENTRE PROCESSOS
SinaisDetalhes:• São eventos disparados dentro de um sistema operacional para indicar
alguma ação dentro de um processo.• Efetua a comunicação desses eventos para um processo.• Os sinais são eventos assíncronos.• Um exemplo de sinal é quando uma aplicação é finalizada.
PROGRAMAÇÃO CONCORRENTE – Prof. Thomás da Costa
package edu.anhanguera.prc.aula05; public class ShutdownHook {
public static void main(String[] args) {Runtime.getRuntime().addShutdownHook(new
Thread() {@Overridepublic void run() {
System.out.println("Terminando o programa");
}});
try {Thread.sleep(5000);
} catch (InterruptedException e) {e.printStackTrace();
}}
}
PROGRAMAÇÃO CONCORRENTE – Prof. Thomás da Costa
Resumo• Comunicação entre processos é troca de informações entre programas.• Essa comunicação pode ser:
• Arquivo compartilhado.• Socket.
• Serialização é o processo de gravar as informações de uma classe em Java em um arquivo.
• Deserialização é o processo de recuperar informações de um arquivo e carrega-los em uma classe Java.
COMUNICAÇÃO ENTRE PROCESSOS
PROGRAMAÇÃO CONCORRENTE – Prof. Thomás da Costa
DEADLOCK
DEADLOCK
PROGRAMAÇÃO CONCORRENTE – Prof. Thomás da Costa
DEADLOCK
O que acontece nessa imagem?
PROGRAMAÇÃO CONCORRENTE – Prof. Thomás da Costa
DEADLOCK
DeadlockO que é?:É quando uma Thread espera a execução de uma outra Thread e vice-versa. Nesta situação, existe um processo de sincronia entre dois objetos compartilhados.
PROGRAMAÇÃO CONCORRENTE – Prof. Thomás da Costa
package edu.anhanguera.prc.aula06; public class DeadLock {
public static void main(String[] args) {String carro1 = new String("Objeto 1");String carro2 = new String("Objeto 2");String carro3 = new String("Objeto 3");
Thread thread1 = new Thread(new Rodovia(carro1, carro2), "THREAD 1");
thread1.start();
Thread thread2 = new Thread(new Rodovia(carro2, carro3), "THREAD 2");
thread2.start();
Thread thread3 = new Thread(new Rodovia(carro3, carro1), "THREAD 3");
thread3.start(); }
}
PROGRAMAÇÃO CONCORRENTE – Prof. Thomás da Costa
package edu.anhanguera.prc.aula06; public class Rodovia implements Runnable {
private String carro1;private String carro2;
public Rodovia(String objeto1, String objeto2) {
this.carro1 = objeto1;this.carro2 = objeto2;
}
public void run() {System.out.println(Thread.currentThread().getName() + " - 1 - Lock no " +
carro1);synchronized (carro1) {
System.out.println(Thread.currentThread().getName() + " - 2 - Lock no " + carro2);
synchronized (carro2) {System.out.println("Lock");try {
Thread.sleep(1000);} catch (InterruptedException e) {
e.printStackTrace();}
}}System.out.println("Saindo do Lock");
}}
PROGRAMAÇÃO CONCORRENTE – Prof. Thomás da Costa
MEMÓRIA COMPARTILHADA
MEMÓRIA COMPARTILHADA
PROGRAMAÇÃO CONCORRENTE – Prof. Thomás da Costa
MEMÓRIA COMPARTILHADA
Memória CompartilhadaO que é?:É o processo de compartilhar informações contidas na memória diretamente em arquivos. Neste processo o Java utiliza diretamente a memória física tornando o processo de leitura e escrita o mais rápido possível.
PROGRAMAÇÃO CONCORRENTE – Prof. Thomás da Costa
package edu.anhanguera.prc.aula07; import java.io.File;import java.io.FileNotFoundException;import java.io.IOException;import java.io.RandomAccessFile;import java.nio.MappedByteBuffer;import java.nio.channels.FileChannel; public class ArquivoMemoriaEscrever {
@SuppressWarnings("resource")public static void main(String[] args) {
long bufferSize = 8 * 10000;try {
File arquivo = new File("/tmp/arquivo_memoria.txt");arquivo.delete();FileChannel fileChannel = new RandomAccessFile(arquivo,
"rw").getChannel();MappedByteBuffer mp =
fileChannel.map(FileChannel.MapMode.READ_WRITE, 0, bufferSize);String valor = "GRAVANDO UMA INFORMACAO";for (int j=0;j<=10;j++) {
mp.put(valor.getBytes());}fileChannel.close();mp.clear();
} catch (FileNotFoundException e) {e.printStackTrace();
} catch (IOException e) {e.printStackTrace();
} }
}
PROGRAMAÇÃO CONCORRENTE – Prof. Thomás da Costa
package edu.anhanguera.prc.aula07; import java.io.File;import java.io.FileNotFoundException;import java.io.IOException;import java.io.RandomAccessFile;import java.nio.MappedByteBuffer;import java.nio.channels.FileChannel; public class ArquivoMemoriaLer {
@SuppressWarnings("resource")public static void main(String[] args) throws FileNotFoundException, IOException,
InterruptedException {
long bufferSize = 8 * 10000;File arquivo = new File("/tmp/arquivo_memoria.txt");FileChannel fileChannel = new RandomAccessFile(arquivo, "r").getChannel();MappedByteBuffer mp = fileChannel.map(FileChannel.MapMode.READ_ONLY, 0,
bufferSize);mp.load();byte[] bytes = new byte[23];for (int i=0;i<=mp.limit()-1;i++) {
mp.get(bytes);String valor = new String(bytes);if (!valor.trim().isEmpty()) { System.out.println(new String(bytes));} else {
break;}
} }
}
ANHANGUERA – 2016.1
PROGRAMAÇÃO CONCORRENTELAB 01 – INSTALAÇÃO DO AMBIENTE JAVA
Prof. Thomás da [email protected]
PROGRAMAÇÃO CONCORRENTE – Prof. Thomás da Costa
INSTALAÇÃO DO AMBIENTE JAVA
INSTALAÇÃO DO AMBIENTE JAVA
PROGRAMAÇÃO CONCORRENTE – Prof. Thomás da Costa
INSTALAÇÃO DO AMBIENTE JAVA
Iremos efetuar a instalação do ambiente de desenvolvimento para a linguagem de programação Java em um sistema operacional Windows.
Instalando o ambienteO que vamos fazer:
PROGRAMAÇÃO CONCORRENTE – Prof. Thomás da Costa
INSTALAÇÃO DO AMBIENTE JAVA
• Instalador do Java JDK 1.7.0http://www.oracle.com/technetwork/pt/java/javase/downloads/index.html
• Eclipse Lunahttps://www.eclipse.org/downloads/
E do Windows 8.1 !!!
As instruções também são validas para outras versões do Windows, somente os passos são diferentes.
Instalando o ambienteO que vamos precisar:
PROGRAMAÇÃO CONCORRENTE – Prof. Thomás da Costa
INSTALAÇÃO DO AMBIENTE JAVA
Antes de iniciar, vamos verificar se o ambiente utilizado é de 32-bits ou de 64-bits para efetuar a instalação correta do Java.
Verificando o ambienteO que vamos fazer:
Botão direito no ícone Windows.
Selecionar a opção Sistema.
PROGRAMAÇÃO CONCORRENTE – Prof. Thomás da Costa
INSTALAÇÃO DO AMBIENTE JAVA
Verificando o ambiente
Nosso ambiente é de 64-bits.
Vamos efetuar o download da versão do Java de 64-bits.
PROGRAMAÇÃO CONCORRENTE – Prof. Thomás da Costa
INSTALAÇÃO DO AMBIENTE JAVA
Download do Java
Clicar neste botão.
Acessar o endereço:http://www.oracle.com/technetwork/pt/java/javase/downloads/index.html
PROGRAMAÇÃO CONCORRENTE – Prof. Thomás da Costa
INSTALAÇÃO DO AMBIENTE JAVA
Download do Java Clicar aqui e aceite os termos.
Escolher versão para Windows: x86 = 32bitsx64 = 64bits
No nosso exemplo vamos baixar a versão Windows x64.
PROGRAMAÇÃO CONCORRENTE – Prof. Thomás da Costa
INSTALAÇÃO DO AMBIENTE JAVA
Instalando o Java Execute o instalador, onde foi baixado.
Responda Sim para iniciar a instalação.
PROGRAMAÇÃO CONCORRENTE – Prof. Thomás da Costa
INSTALAÇÃO DO AMBIENTE JAVA
Instalando o Java (JDK)
Clicar em Next.
Selecione um diretório para instalação do JDK, pode ser o mesmo sugerido pelo setup.
Clicar em Next.
PROGRAMAÇÃO CONCORRENTE – Prof. Thomás da Costa
INSTALAÇÃO DO AMBIENTE JAVA
Instalando o Java (JRE)
Instalando o JDK, depois será iniciado a instalação do JRE.
Selecione um diretório para instalação do JRE, pode ser o mesmo sugerido pelo setup.
Clicar em Next.
PROGRAMAÇÃO CONCORRENTE – Prof. Thomás da Costa
INSTALAÇÃO DO AMBIENTE JAVA
Concluindo a instalação
Instalando o JRE.
Clicar em Close e a instalação foi concluída.
PROGRAMAÇÃO CONCORRENTE – Prof. Thomás da Costa
INSTALAÇÃO DO AMBIENTE JAVA
Vamos configurar a variável de ambiente chamada JAVA_HOME, para executar o Java em linha de comando e iremos incluir os executáveis do JDK no PATH do Windows.
Configurando o ambienteO que vamos fazer:
PROGRAMAÇÃO CONCORRENTE – Prof. Thomás da Costa
INSTALAÇÃO DO AMBIENTE JAVA
Para quem não conhece a definição de variável de ambiente e PATH do sistema operacional, acessar os links a seguir:
Configurando o ambienteDica:
Variáveis de Ambiente e PATH
https://technet.microsoft.com/pt-br/library/cc668471.aspxhttp://pt.wikipedia.org/wiki/Vari%C3%A1vel_de_ambientehttp://en.wikipedia.org/wiki/PATH_%28variable%29
PROGRAMAÇÃO CONCORRENTE – Prof. Thomás da Costa
INSTALAÇÃO DO AMBIENTE JAVA
Configurando o ambiente
Botão direito no ícone Windows.
Selecionar a opção Sistema.
PROGRAMAÇÃO CONCORRENTE – Prof. Thomás da Costa
INSTALAÇÃO DO AMBIENTE JAVA
Configurando o ambiente
Selecionar “Configurações avançadas do sistema”
PROGRAMAÇÃO CONCORRENTE – Prof. Thomás da Costa
INSTALAÇÃO DO AMBIENTE JAVA
Configurando o ambienteSelecionar “Variáveis de Ambiente”
Clicar em “Novo”
PROGRAMAÇÃO CONCORRENTE – Prof. Thomás da Costa
INSTALAÇÃO DO AMBIENTE JAVA
Configurando o ambiente
Incluir a variável “JAVA_HOME”. No “Valor da variável”, colocar o diretório de instalação do JDK
Alterar a variável “PATH” e incluir o diretório de instalação do JDK
mais a pasta “bin”
PROGRAMAÇÃO CONCORRENTE – Prof. Thomás da Costa
INSTALAÇÃO DO AMBIENTE JAVA
Testando a instalação
Executar o comando “Windows + R”
Digite o comando “cmd”
Digite o comando “java -version”
PROGRAMAÇÃO CONCORRENTE – Prof. Thomás da Costa
INSTALAÇÃO DO AMBIENTE JAVA
Seguindo este roteiro passo-a-passo, teremos o Java instalado corretamente no sistema, para iniciar o desenvolvimento de nossas aplicações.
Instalação concluídaTerminamos !!!
Obrigado !!!
ANHANGUERA – 2016.1