programação concorrente - curso completo

Post on 12-Apr-2017

470 Views

Category:

Technology

6 Downloads

Preview:

Click to see full reader

TRANSCRIPT

ANHANGUERA – 2016.1

PROGRAMAÇÃO CONCORRENTECURSO COMPLETO

Prof. Thomás da Costathomascosta@aedu.com

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

thomascosta@aedu.com

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: thomascosta@aedu.com

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 Costathomascosta@aedu.com

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

top related