Buscar

The Bathroom Unisex Problem em Java2

Prévia do material em texto

The Bathroom Unisex Problem em Java
Problema 
O problema do banheiro unissex consiste a partir de uma história de uma mulher que trabalhava distante do banheiro feminino. 
O banheiro mais próximo estava reservado somente para homens, então foi solicitado por ela, para que aquele banheiro possa ser utilizado por homens e mulheres, unissex. 
O chefe concordou com uma condição de proposta, com o objetivo de ajudá-la, mas colocou alguma restrições.
1
2
Problema - Condições
Condição 1 
O banheiro só pode conter ou somente homens ou somentes mulheres, nunca ambos ao mesmo tempo.
Condição 2
O banheiro deve ter um limite de 5 pessoas, para evitar que funcionários possam “dar nós” com colegas de trabalho.
1
3
Solução Proposta
Muitas formas para solução proposta. A que foi escolhida foi por semáforos. 
Verificado o espaço do tamanho relativamente pequeno, o banheiro tem capacidade limite igual C, fornecido como entrada via linha de comando ou prefixo como um valor constante. 
Sendo assim em cada momento pode ser utilizado por uma pessoa.
Importante, há uma dependência para Java 8.0
1
4
Instalação
Para o uso desta solução é necessária a instalação do Java SE Runtime Environment (JRE) e Java SE Development Kit (JDK), alem da IDE (como NetBeans ou Eclipse).
2
5
Java
6
Instalação
Para instalação do java JDK e JRE é necessário realizar o download do site: 
JDK:
https://www.oracle.com/br/java/technologies/javase-jdk11-downloads.html
JRE:
https://www.java.com/pt-BR/download/manual.jsp 
Java
7
Instalação
Vale lembrar que algumas IDEs atuais, já disponibilizam a instalação com estes pacotes inclusos
Caso existam dúvidas referente ao processo de instalação, a empresa disponibiliza o seguinte link para apoio: 
https://www.java.com/pt-BR/download/help/download_options.html 
Eclipse
8
Instalação
 
Neste trabalho optamos pelo uso da IDE Eclipse, para realizar o download basta acessar o link:
	https://www.eclipse.org/downloads/
 
Eclipse
9
Instalação
 
Apos o download finalizar, abra e instale o gerenciador de downloads do eclipse
	Escolha uma versão (para nossa solução usamos “eclipse ide for java developers)
Eclipse
10
Instalação
 
Selecione o local de instalação e clique em “install”
Eclipse
11
Instalação
 
Após clicar em install será solicitado o aceite a alguns certificados:
Eclipse
12
Instalação
 
Ao final da instalação será disponibilizada a tela de Launch para iniciar o eclipse
Eclipse
13
Instalação
 
Por fim informe o diretório do workspace
Eclipse
14
Instalação
Caso queira compilar o programa via terminal linux faça uso do passo a passo abaixo:
1 - Faça o download do projeto: https://github.com/Marcos15121993/PS27S
2 - Abra a pasta do projeto: cd pc27s
Eclipse
15
Instalação
3 - Execute o arquivo ./patente.sh
#!/bin/bash
cd src
# Compile
javac main/java/com/banheiro/unisex/java/pc27s/Pc27sApplication/*.java main/java/banheiro/Banheiro/*.java main/java/pessoa/Pessoa/*.java
# Generate jar
jar cfm ../Pc27sApplication.jar ../manifest.mf Pc27sApplication/Pc27sApplication/*.class Pc27sApplication/bathroom/*.class Pc27sApplication/person/*.class
Feito isso execute usando o comando: 
	java -jar Pc27sApplication.jar
Principais Funções
Java RMI
3
16
Remote Method Invocation (RMI) - Send/Receive
É uma API que permite que uma aplicação acesse métodos de um objeto em execução em outro JVM. A arquitetura RMI consiste em três camadas:
 
17
Stub/skeleton: 
Fornece interface de comunicação entre os objetos da aplicação.
Camada remota: 
Cria e gerencia referências para objetos remotos.
Camada de transporte: 
Implementa o protocolo que especifica o formato de solicitações enviadas aos objetos remotos pela rede.
Arquitetura de camadas de RMI
Objeto cliente
Stub
Gerenciador de
Referencias remitas
Objeto servidor
Skeleton
Gerenciador de
Referencias remitas
Processo cliente
Processo servidor
Camada de transporte RMI 
Objetos intermediários
Stub
Oferece implementações dos métodos do serviço remoto que são invocadas no lado do cliente.Ele cria um bloco de informações e as envia ao servidor.
Um identificador do objeto remoto a ser usado;
Nome do método que deve ser invocado;
Parâmetros para o JVM remoto
Skeleton
Desenpacota o dados e invoca o objeto remoto, onde ele ele executa a seguinte sequência de ações:
Chama o objeto real ao qual vai ser entregue o pacote;
Encaminha os parâmetro recebidos do objeto stub para o método.
19
Interfaces e classes
20
Java RMI é um sistema de linguagem individual. Todas as interfaces e classes para o sistema de RMI são definidos no pacote java.rmi. A classe de objeto remoto implementa a interface remota, enquanto as outras classes estendem RemoteObject, onde possui uma super classe de exceções a RemoteException.
A interface remota
Definida pela extensão da interface Remote do pacote java.rmi, ela declara quais os metodos que o cliente pode invocar, onde deve satisfazer às seguintes condições: 
Extender a classe Remote;
Cada método na interface remota deve incluir RemoteException;
RemoteObject
21
Funções são fornecidas pela classe RemoteObject e sua subclasses Remote Server, Activatable e UnicastRemoteObject.
Remote Server implementa na classe java.lang.Object os métodos toString, equals e hashCode;
Activatable e UnicastRemoteObject criam e exportam objetos remotos.
RemoteException
Ao ocorrer um erro na chamada de método a super-classe RemoteException é lançada, a classe é obrigatória ao declarar uma interface remota, garantindo assim que o programador tenha lidado com as exceções que podem ocorrer.
Etapas para implementação
Definir a interface remota;
Implementar a interface remota;
Criar o objetos Stub e Skeleton a partir da classe de implementação usando rmic*.
Execute o comando “start rmiregistry**” que inicia o serviço de registro;
Crie e execute o programa do servidor
Crie e execute o programa do cliente;
22
*O compilador rmic gera stub e arquivos de classe de esqueleto (protocolo JRMP) e arquivos de classe de stub e tie (protocolo IIOP) para objetos remotos;
**Inicia o servidor do RMI;
23
Manta
Manta é uma aplicação de Java RMI a qual tem um desempenho melhor em relação a outros RMI, pois a mesma trabalha com uma Serialização e comunicação especialmente rápida entre seus próprios nós.
Concorrência e paralelismo
Java
4
24
Monitores
Mecanismo de sincronização, que monitora como as threads acessam os recursos.
25
Exclusão mútua: 
Evita que processos ou threads acessem ao mesmo tempo um recurso compartilhado.
Cooperação:
Auxilia threads a agir juntas para completar seus processos.
Recursos do monitor
Threads em execução em um monitor podem ser bloqueados enquanto aguardam que certas condições sejam atendidas.
Apenas um segmento de cada vez tem acesso exclusivo a uma seção crítica de código.
Um thread pode notificar outros threads quando as condições que eles estão esperando forem atendidas.
26
Monitores em Java
27
A seção crítica de um programa é um trecho de código que é acessado por mais de uma thread.
A seções críticas em Java é marcado pela palavra synchronized, existindo uma conexão lógica entre os monitores e cada objeto ou classe.
A implementação do conceito em Java se baseia em entry set e wait set.
O entry set organiza quais threads e qual a ordem que iram entrar na área critica.
Wait set contém as threads que estão esperando para entrar novamente na área crítica.
Métodos
28
Wait(), notify() e notifyAll() são métodos que permitem a colaboração entre as threads em blocos synchronized(regiões críticas).
Wait(): Força a thread atual a liberar o monitor e esperar até que outra thread execute notify()ou notifyAll(). Podendo ter como parâmetro o tempo até que a thread será ativada automaticamente.
Notify(): Transmite para qualquer uma das threads que possuem o wait() para despertar, qual das threads que irá despertar depende da implementação feita.
NotifyAll(): Desperta todas as threads que estão esperando o monitor de um objeto.
Semáforos
Um semáforo controla o acesso a um recurso compartilhados por meio de um contador, se o semáforo for maior que 1(um) o acesso ao recurso está liberado, porem, se o semáforo estiver em 0(zero) o acesso está negado.
O Java possui o java.util.concurrent que implementa os semaforos. 
29
Inicia o 
Contador do
semáfaro
Semáfaro > 0
Semáforo libera 
o acesso ao 
recurso 
compartilhado
Semáfaro ++
Thread tenta 
permissão de
 acesso
Não
Sim
Thread bloqueada, 
esperar próxima permissão
Thread libera 
a permissão
(Fluxograma de um semáfaro)
Construtores e Métodos
30
Semaphore(): O construtor pode ter duas formas a primeira, 
Semaphore(int num), onde “num” representa o número de threads que podem acessar um recurso compartilhado e o segundo, 
Semáforo (int num, boolean how), que ao atribuir true ao “how” todas as thread em espera recebem uma permissão na ordem em que solicitaram.
TryAcquire(): Tenta adquirir uma licença do semáforo;
Acquire(): Adquire uma licença que será bloqueada;
Release(): Libera a licença;
AvailablePermits(): Retorna o número de licenças disponíveis no semáforo;
Vamos ao código
31
Referências
https://moodle.utfpr.edu.br/pluginfile.php/2085238/mod_resource/content/0/Aula%206%20-%20Mem%C3%B3ria%20Compartilhada.pdf.
https://www.baeldung.com/cs/monitor.
https://www.baeldung.com/java-wait-notify.
https://howtodoinjava.com/java/multi-threading/multithreading-difference-between-lock-and-monitor/
 https://www.geeksforgeeks.org/semaphore-in-java/
 https://www.baeldung.com/java-semaphore
https://docs.oracle.com/javase/7/docs/api/java/util/concurrent/Semaphore.html
https://docs.oracle.com/javase/tutorial/rmi/index.html
https://www.devmedia.com.br/tutorial-rmi-remote-method-invocation/6442
 https://github.com/brenov/unisex-bathroom
 https://www.devmedia.com.br/uma-introducao-ao-rmi-em-java/28681
https://nick-lab.gs.washington.edu/java/jdk1.3.1/tooldocs/solaris/rmic.html
32
Referências
https://github.com/brenov/unisex-bathroom
http://cocic.cm.utfpr.edu.br/progconcorrente/doku.php?id=the_unisex_bathroom_problem
33
Obrigado!
34

Continue navegando