O documento apresenta um curso de Programação Concorrente ministrado pelo professor Thomás da Costa. O curso aborda conceitos básicos de sistemas operacionais, programação concorrente em Java e avaliação com provas e trabalhos.
Uma apresentação como um “Caso de Uso” pessoal, onde pretendo no tempo desta palestra relatar um pouco de tudo que aprendi em relação a Linux, Software Livre e a Comunidade. Citarei alguns erros que cometi e como evita-los, onde busquei (e ainda busco) ajuda, como aprender, como contribuir, enfim, um relato pessoal com objetivo de contribuir a todos querem, e usam, Linux não como uma ferramenta para trabalho, mas sim, também como um sistema operacional de uso doméstico.
Palestra feita no Seminário Tchelinux de Pelotas de 28.08.2010.
+informações autor: luizrauber.blogspot.com
+informações Tchelinux: tchelinux.org
Desbravando a Web com Python. Palestra apresentada no RuPy Sergipe 2014.
Nessa palestra falei um pouco sobre Python e quais frameworks podem nos ajudar nesse desafio.
Uma apresentação como um “Caso de Uso” pessoal, onde pretendo no tempo desta palestra relatar um pouco de tudo que aprendi em relação a Linux, Software Livre e a Comunidade. Citarei alguns erros que cometi e como evita-los, onde busquei (e ainda busco) ajuda, como aprender, como contribuir, enfim, um relato pessoal com objetivo de contribuir a todos querem, e usam, Linux não como uma ferramenta para trabalho, mas sim, também como um sistema operacional de uso doméstico.
Palestra feita no Seminário Tchelinux de Pelotas de 28.08.2010.
+informações autor: luizrauber.blogspot.com
+informações Tchelinux: tchelinux.org
Desbravando a Web com Python. Palestra apresentada no RuPy Sergipe 2014.
Nessa palestra falei um pouco sobre Python e quais frameworks podem nos ajudar nesse desafio.
Apresentação do Projeto PRIME SCRUM. trabalho final do curso de Análise e Des...Thiago Barros, PSM
Apresentação do projeto Prime Scrum trabalho final do curso de Análise e Desenvolvimento de Sistemas do IFSP São Carlos. O projeto consiste em um sistema de gerenciamento de projetos que utilizam Scrum como metodologia.
Lorensutti,
Essa apostila é a base que você precisa para
passar nessa prova, ele tem apenas 15 páginas
e o melhor considerado por mim.
tire umas 2 horas para estudá-la e se alimente bem
porque é comum bater aquela fome na hora que
você está estudando programação.
não dê atenção pra mais nada.
e Bons estudos ...
2. 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
3. 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
4. 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.
5. PROGRAMAÇÃO CONCORRENTE – Prof. Thomás da Costa
APRESENTAÇÃO
Média
70% Prova Obrigatória
30% Trabalho
70% Prova Obrigatória
30% Trabalho
6. 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.
7. 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.
8. 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
9. 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:
10. 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?
11. PROGRAMAÇÃO CONCORRENTE – Prof. Thomás da Costa
APRESENTAÇÃO
• Conceitos básicos.
• Processos concorrentes.
• Sincronização.
• Semáforos.
O que vamos aprender
Onde tudo começa:
Vamos ver o PEA. !!!
12. PROGRAMAÇÃO CONCORRENTE – Prof. Thomás da Costa
APRESENTAÇÃO
PEA
Conceitos 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.
13. 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
14. PROGRAMAÇÃO CONCORRENTE – Prof. Thomás da Costa
APRESENTAÇÃO
Bibliografias Utilizadas
TANENBAUM, Andrew S; STEEN, Maarten Van. Sistemas
distribuídos: princípios e paradigmas. 2ª ed. São Paulo: Pearson -
Prentice Hall, 2010.
15. PROGRAMAÇÃO CONCORRENTE – Prof. Thomás da Costa
APRESENTAÇÃO
Vamos iniciar nosso curso !!!
Na próxima aula !!!
17. 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 Operacional
O que é?:
SISTEMAS OPERACIONAIS
18. 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 Operacionais
Objetivos:
SISTEMAS OPERACIONAIS
19. 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 Operacionais
Dias atuais:
SISTEMAS OPERACIONAIS
20. 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
23. 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órico
Origens:
A TECNOLOGIA JAVA
24. PROGRAMAÇÃO CONCORRENTE – Prof. Thomás da Costa
A TECNOLOGIA JAVA
Fonte: http://viralpatel.net/blogs/java-virtual-machine-an-inside-story/
25. 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.
JVM
Java Virtual Machine:
A TECNOLOGIA JAVA
26. 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
27. 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 !!!
Java
O que vamos ver na revisão:
A TECNOLOGIA JAVA
Vamos começar !!!
28. 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?");
}
}
29. 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 varargs
System.out.format("%s formatada %s vários %s",
new String("Saida"),
new String("com"),
new String("paramêtros"));
}
}
Exemplo 02
30. 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
31. 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
32. 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
33. 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
34. 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
36. 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
38. PROGRAMAÇÃO CONCORRENTE – Prof. Thomás da Costa
THREADS
Threads
Detalhes:
• 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.
39. 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
40. PROGRAMAÇÃO CONCORRENTE – Prof. Thomás da Costa
Threads
O 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.
41. PROGRAMAÇÃO CONCORRENTE – Prof. Thomás da Costa
Threads
Detalhes:
• 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
42. PROGRAMAÇÃO CONCORRENTE – Prof. Thomás da Costa
Threads
Detalhes:
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.
43. PROGRAMAÇÃO CONCORRENTE – Prof. Thomás da Costa
Threads
Ciclo de Vida:
THREADS
Fonte: http://www3.ntu.edu.sg/home/ehchua/programming/java/j5e_multithreading.html
44. PROGRAMAÇÃO CONCORRENTE – Prof. Thomás da Costa
Threads
Criando uma Thread:
THREADS
public class ExemploThread extends Thread {
@Override
public 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 Thread
Classe Thread
45. PROGRAMAÇÃO CONCORRENTE – Prof. Thomás da Costa
Exemplo 01
package edu.anhanguera.prc.aula03;
public class ExemploThread extends Thread {
@Override
public void run() {
System.out.println("Executando ExemploThread");
}
public static void main(String[] args) {
ExemploThread exemploThread = new ExemploThread();
exemploThread.start();
}
}
46. PROGRAMAÇÃO CONCORRENTE – Prof. Thomás da Costa
Threads
Detalhes:
• 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
47. PROGRAMAÇÃO CONCORRENTE – Prof. Thomás da Costa
Threads
Criando 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
48. PROGRAMAÇÃO CONCORRENTE – Prof. Thomás da Costa
Exemplo 02
package 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();
}
}
49. PROGRAMAÇÃO CONCORRENTE – Prof. Thomás da Costa
Threads
Detalhes:
• 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
50. 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();
}
}
51. 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:
52. 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();
}
}
53. 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) {}
}
}
54. 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
56. PROGRAMAÇÃO CONCORRENTE – Prof. Thomás da Costa
Sincronização
Detalhes:
• 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
57. PROGRAMAÇÃO CONCORRENTE – Prof. Thomás da Costa
Sincronização
Detalhes:
• 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.
58. 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();
}
}
59. PROGRAMAÇÃO CONCORRENTE – Prof. Thomás da Costa
SINCRONIZAÇÃO
Resultado final incorreto. Deveria
efetuar a contagem corretamente.
60. 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();
}
}
61. PROGRAMAÇÃO CONCORRENTE – Prof. Thomás da Costa
SINCRONIZAÇÃO
Contagem efetuada com sucesso.
Valor final correto !!!
62. PROGRAMAÇÃO CONCORRENTE – Prof. Thomás da Costa
Sincronização
Detalhes:
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.
63. PROGRAMAÇÃO CONCORRENTE – Prof. Thomás da Costa
Sincronização
Outro 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.
64. 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;
}
}
65. 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();
}
}
69. 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
70. PROGRAMAÇÃO CONCORRENTE – Prof. Thomás da Costa
COMUNICAÇÃO ENTRE PROCESSOS
COMUNICAÇÃO ENTRE PROCESSOS
71. PROGRAMAÇÃO CONCORRENTE – Prof. Thomás da Costa
COMUNICAÇÃO ENTRE PROCESSOS
Comunicação Entre Processos
O 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.
72. PROGRAMAÇÃO CONCORRENTE – Prof. Thomás da Costa
COMUNICAÇÃO ENTRE PROCESSOS
Comunicação Entre Processos
Tipos de comunicação que vamos estudar:
• Arquivos compartilhados utilizando Serialização de objetos em Java.
• Comunicação Socket via TCP/IP.
73. PROGRAMAÇÃO CONCORRENTE – Prof. Thomás da Costa
COMUNICAÇÃO ENTRE PROCESSOS
Arquivos Compartilhados
Detalhes:
• 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.
74. 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;
}
}
75. 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) {}
}
}
}
76. 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) {}
}
}
}
77. PROGRAMAÇÃO CONCORRENTE – Prof. Thomás da Costa
COMUNICAÇÃO ENTRE PROCESSOS
Arquivos Compartilhados
Detalhes:
• 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.
78. PROGRAMAÇÃO CONCORRENTE – Prof. Thomás da Costa
COMUNICAÇÃO ENTRE PROCESSOS
Sockets
Detalhes:
• 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.
79. 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) {}
}
}
}
80. PROGRAMAÇÃO CONCORRENTE – Prof. Thomás da Costa
COMUNICAÇÃO ENTRE PROCESSOS
Sockets
Detalhes:
• 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.
81. 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;
}
}
82. 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) {}
}
}
}
83. PROGRAMAÇÃO CONCORRENTE – Prof. Thomás da Costa
COMUNICAÇÃO ENTRE PROCESSOS
Sockets
Detalhes:
• 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.
84. PROGRAMAÇÃO CONCORRENTE – Prof. Thomás da Costa
COMUNICAÇÃO ENTRE PROCESSOS
Sinais
Detalhes:
• 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.
85. 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() {
@Override
public void run() {
System.out.println("Terminando o programa");
}
});
try {
Thread.sleep(5000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
86. 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
89. PROGRAMAÇÃO CONCORRENTE – Prof. Thomás da Costa
DEADLOCK
Deadlock
O 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.
90. 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();
}
}
91. 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");
}
}
93. PROGRAMAÇÃO CONCORRENTE – Prof. Thomás da Costa
MEMÓRIA COMPARTILHADA
Memória Compartilhada
O 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.
94. 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();
}
}
}
95. 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;
}
}
}
}
97. PROGRAMAÇÃO CONCORRENTE – Prof. Thomás da Costa
INSTALAÇÃO DO AMBIENTE JAVA
INSTALAÇÃO DO AMBIENTE JAVA
98. 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 ambiente
O que vamos fazer:
99. PROGRAMAÇÃO CONCORRENTE – Prof. Thomás da Costa
INSTALAÇÃO DO AMBIENTE JAVA
• Instalador do Java JDK 1.7.0
http://www.oracle.com/technetwork/pt/java/javase/downloads/index.html
• Eclipse Luna
https://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 ambiente
O que vamos precisar:
100. 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 ambiente
O que vamos fazer:
Botão direito no ícone Windows.
Selecionar a opção Sistema.
101. 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.
102. 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
103. 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 = 32bits
x64 = 64bits
No nosso exemplo vamos baixar a versão Windows x64.
104. 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.
105. 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.
106. 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.
107. 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.
108. 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 ambiente
O que vamos fazer:
109. 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 ambiente
Dica:
Variáveis de Ambiente e PATH
https://technet.microsoft.com/pt-br/library/cc668471.aspx
http://pt.wikipedia.org/wiki/Vari%C3%A1vel_de_ambiente
http://en.wikipedia.org/wiki/PATH_%28variable%29
110. 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.
111. PROGRAMAÇÃO CONCORRENTE – Prof. Thomás da Costa
INSTALAÇÃO DO AMBIENTE JAVA
Configurando o ambiente
Selecionar “Configurações
avançadas do sistema”
112. PROGRAMAÇÃO CONCORRENTE – Prof. Thomás da Costa
INSTALAÇÃO DO AMBIENTE JAVA
Configurando o ambiente
Selecionar “Variáveis de Ambiente”
Clicar em “Novo”
113. 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”
114. 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”
115. 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ída
Terminamos !!!