Baixe o app para aproveitar ainda mais
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
Compartilhar