Sei sulla pagina 1di 5

MULTITHREADING E RMI EM JAVA Jonas Mayer Universidade Regional Integrada Curso de Cincia da Computao Campus Santiago Av.

v. Batista Sobrinho, s/n CEP 97700-000 Santiago RS

Resumo A elaborao do artigo foi feita a partir de uma pesquisa bibliogrfica, tendo como objetivo ressaltar alguns dos aspectos mais importantes sobre Multithreading e RMI bem como alguns exemplos de mtodos utilizando estas tecnologias. Palavras-chave: Multithreading; Java; RMI; 1. Introduo Multithreads e RMI so recursos que o Java oferece para os programadores possibilitando respectivamente programao concorrentemente e comunicao remota entre aplicativos. 2. Multithreading O Java permite, por meio de uma tcnica chamada Multithreading, que os programadores desenvolvam programas com atividades paralelas, ou melhor concorrentes. O programador especifica os aplicativos que contem threads de execuo, em que cada thread designa uma parte de um programa que pode executar concorrentemente com outras threads. Um problema com aplicativos de uma nica thread que atividades longas devem ser concludas antes que outras atividades iniciem. Em um aplicativo com mltiplas threads, as threads podem ser distribudas por mltiplos processadores (se eles estiverem disponveis), de modo que mltiplas tarefas so realizadas concorrentemente e o aplicativo pode operar de modo mais eficiente. A programao de aplicativos concorrentes um empreendimento difcil e prospero a erro. Se achar que deve utilizar a sincronizao em um programa, voc deve seguir algumas diretrizes simples. Primeiro, utilize classes existentes da API do Java ( como a classe ArrayBlockingQueue ) que gerencia a sincronizao para voc. As classes na API do Java foram completamente testadas e depuradas para evitar interrupes e armadilhas comuns. Segundo, se achar que precisa de funcionalidades mais personalizadas do que as fornecidas nas APIs do Java, voc deve utilizar a palavra-chave syncronized e os mtodos wait, notify e notifyAll do Object. Por fim, se precisar de capacidade ainda mais complexa, ento voc deve utilizar as interfaces Lock e Condition. 2.1 Estado de thread A qualquer dado momento, diz-se que uma thread est em um dos vrios estados de thread que so ilustrados no diagrama. Uma nova thread inicia seu ciclo de vida no estado novo. Ela permanece nesse estado at o programa iniciar a thread, o que a coloca no estado executvel.

Fig.2.1 Diagrama de estado do ciclo de vida da thread [DEI 2005]

As vezes uma thread entra no estado de espera enquanto outra thread realizar uma tarefa. Uma vez nesse estado, a thread s volta ao estado executvel quando thread sinalizar a thread de espera para retornara execuo. Uma thread executvel pode entrar no estado espera sincronizada por um intervalo especifico de tempo. Uma thread nesse estado volta para o estado executvel quando esse intervalo de tempo expira ou quando ocorre o evento que ele esta esperando. As threads de espera sincronizada no podem utilizar um processador, mesmo que haja um disponvel. Uma thread pode transitar para o estado de espera sincronizada se fornecer um intervalo de espera opcional quando ela estiver esperando outra thread realizar uma tarefa. Essa thread retornar ao estado executvel quando ela for sinalizada por outra thread ou quando o intervalo sincronizado expirar - o que ocorrer primeiro. 2.2 Relacionamento entre Produtor e Consumidor Em um relacionamento produtor/consumidor, a parte produtora de um aplicativo gera dados e os armazena em um objeto compartilhado, e a parte consumidora de um aplicativo l os dados do objeto compartilhado. Em um relacionamento produtor/consumidor de mltiplas threads, uma thread produtora que gera dados e os coloca em um objeto compartilhado chamado buffer. 2.3 Sincronizao Frequentemente, mltiplas threads de execuo manipulam um objeto compartilhado na memoria. Quando isso ocorre e esse objeto modificado por uma ou mais threads, podem ocorrer resultados indeterminados, a menos que o objeto compartilhado seja gerenciado adequadamente. 2.4 Relacionamento de produtor/consumidor com Buffer circular Para minimizar a quantidade de tempo de espera por threads que compartilham recursos e operam nas mesmas velocidades mdias, podemos implementar um buffer circular, que fornece espaos de buffer extra em que a produtora pode colocar valores e a partir do qual a consumidora pode recuper-los.

3.RMI As capacidades fundamentais de comunicao em rede do Java esto no pacote java.net , que oferece tanto comunicao baseada em sockets como em pacotes. Para visualizaes de nvel mais alto das redes so fornecidas classes e interfaces nos pacotes java.rmi para Remote Method Invocation (RMI) e nos pacotes org.omg para Common Object Request Brocket Architecture (CORBA). Os pacotes RMI permitem que objetos Java que executam em JVMs separadas (normalmente em computadores separados) se comunicarem via chamada de mtodos remotos. Essas chamadas parecem invocar mtodos em um objeto no mesmo programa, mas na realidade elas tem recursos de rede integrados(baseadas nas capacidades do pacote java.net ) que comunicaram as chamadas de mtodo para outro objeto em um computador separado. 3.1 Nomeando Objetos remotos Os clientes acham os servios remotos usando o servio de nomeao ou diretrio. Isso parece um pouco redundante, mas o servio de nomeao ou diretrio roda como um endereo bem formado (host:port). O RMI pode usar diferentes tipos de servios de diretrio, incluindo o JNDI. O prprio RMI inclui um simples servio, chamado de RMI Registry. O RMI Registry roda em cada maquina que hospeda o servio remoto, por definio na porta 1099. Numa mquina host, um programa servidor cria um servio remoto, primeiramente criando o objeto que implemente aquele servio. Em seguida ele exporta aquele objeto para o RMI. Quando o objeto exportado o RMI cria um servio que aguarda as conexes do cliente. O servidor registra o objeto no RMI Registry, com um nome pblico. No lado do cliente o RMI Registry acessado atravs da classe esttica Naming. Ela provm o mtodo lookup, que o cliente usa para requisitar o registro. Esse mtodo aceita a URL que especifica o nome do servidor e o nome do servio desejado. O mtodo retorna uma referncia remota para o objeto do servio. A URL formada como seguinte: rmi://<host_name>[:port_number]/<service_name> 3.2 Serializao A capacidade de armazenar e recuperar objetos em JAVA essencial quando se fala de RMI. A maneira encontrada para armazenar esses objetos em uma forma serializada sem ocupar muita memria foi representar os estados do objeto suficientes para reconstru-lo. Objetos serializados em Java devem ser capazes de identificar e verificar a classe Java da qual eles derivam e recuperar seu contedo para criar uma nova instncia. Frequentemente, objetos armazenados fazem referncia a outros objetos. Esses outros objetos tambm devem ser armazenados e na recuperao, todos devem ser dezarmazenados ao mesmo tempo, para que as relaes entre ele no se percam. 3.3 Usando RMI Um sistema RMI composto de vrias partes: Definio das interfaces para os servios remotos Implementaes dos servios remotos Arquivos de Stub e Skeletons Um servidor para hospedar os servios remotos Um servio de RMI Naming que permite o cliente achar os servios remotos Um provedor de arquivos de classes (servidor http ou ftp)

Um programa cliente que necessita os servios remotos

3.4 Programa Exemplo Arquivo Hello.java (interface) import java.net.*; import java.rmi.*; public interface Hello extends Remote { String sayHello() throws RemoteException; } Arquivo HelloImpl.java (implementao do objeto remoto) import java.rmi.*; import java.rmi.server.*; import java.rmi.registry.*; import java.net.*; public class HelloImpl extends UnicastRemoteObject implements Hello { public HelloImpl() throws RemoteException{ super(); } public String sayHello() { return "HelloWorld!"; } } Arquivo HelloServer.java (servidor) import java.net.*; import java.rmi.*; import java.rmi.server.*; import java.rmi.registry.*; public class HelloServer { public static void main (String args [ ]) { //Cria e instala o security manager //System.setSecurityManager(new RMISecurityManager() ); try { //Cria HelloImpl HelloImpl obj = new HelloImpl(); Naming.rebind("HelloServer", obj); System.out.println("Hello Server pronto."); } catch(Exception e) { System.out.println("HelloServer erro"+ e.getMessage()); } } }

Arquivo HelloClient.java (cliente) import java.net.*; import java.rmi.*; import java.rmi.registry.*; import java.rmi.server.*; public class HelloClient { public static void main(String args[ ]) { //Cria e instala o security manager //System.setSecurityManager (new RMISecurityManager () ); try { Hello obj = (Hello)Naming.lookup("rmi://vip03/HelloServer"); System.out.println(obj.sayHello()); } catch(Exception e) { System.out.println("HelloClient erro"+ e.getMessage()); } System.exit(0); } } 4. Concluso Multithreading um recurso importante do Java que aumenta a performasse do programa e oferece paralelismo, porem um recurso de difcil implementao e prospero a erro. RMI uma boa alternativa na comunicao entre aplicativos, pois mais simples que Sockets pois abstrai a os detalhes do estabelecimento das conexes entre os hosts e a transferncia de dados entre eles. Porm CORBA uma soluo mais geral, j que permite que objetos escritos em vrias linguagens comuniquem-se entre si com o Java. Referncias [DEI 2005] [DES 2003] [SOU ] DEITEL. H. M; DEITEL. P. J. , Java Como Programar, 6 edio, 2005 Editora Pearson Education Inc. DESTRO. Daniel, Introduo ao RMI, http://www.guj.com.br/articles/37 SOUZA Luciana ; ARAUJO Sandra Regina ; RMI - REMOTE METHOD INVOCATION, http://www.ime.uerj.br/~alexszt/cursos/topesp_inter/trabs/992/g6/

Potrebbero piacerti anche