Exclusion mutuelle avec jeton [Résolu]

newgame 52 Messages postés lundi 2 février 2009Date d'inscription 24 juillet 2013 Dernière intervention - 8 déc. 2012 à 19:20 - Dernière réponse :  bébéprogrammeuse
- 30 nov. 2013 à 11:43
salut,
j'ai un TP où j’essaie de réaliser fonctionnement en exclusion mutuelle avec l'algorithme du jeton
en deux mot l'explication de l'algorithme:
chaque processus voulant entré en section critique doit acquérir un jeton qu'il demande a tous les autres processus ,un processus qui n' a pas besoin d'acceder à la SC et ayant le jeton le lui envoi
Donc mon problème est quand j’exécute deux instance client et j'initialise le jeton à l'un d'eux le processus ayant le jeton s’exécute normalement mais l'autre ne s’exécute jamais

voici mon code:
**************rmiclient********
package rmi;
import java.awt.GridLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.net.MalformedURLException;
import java.rmi.Naming;
import java.rmi.NotBoundException;
import java.rmi.RemoteException;
import java.rmi.registry.LocateRegistry;
import java.rmi.registry.Registry;

import javax.swing.*;

public class rmiclient extends javax.swing.JFrame {
JTextField prenom = new JTextField();
JTextField nom = new JTextField();
JLabel p = new JLabel("prenom");
JLabel n = new JLabel("nom");
JButton b =new JButton("print");
public rmiclient() {

GridLayout g = new GridLayout(3, 2);
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
getContentPane().setLayout(g);
getContentPane().add(p);
getContentPane().add(prenom);
getContentPane().add(n);
getContentPane().add(nom);
getContentPane().add(b);
b.addActionListener(new ActionListener() {


public void actionPerformed(ActionEvent arg0) {
//JOptionPane.showMessageDialog(null,"nom: "+ nom.getText()+ " prenom: "+prenom.getText());
try {
Registry registry=LocateRegistry.getRegistry("127.0.0.1",(new Integer("1099").intValue()));
Rmiinterface rmiServer = (Rmiinterface)registry.lookup("rmiServer");
Scritique.lock();
String pr=prenom.getText();
String no=nom.getText();
rmiServer.setNom(no);
Thread.sleep(5000);
rmiServer.setPrenom(pr);
rmiServer.print();
Scritique.unlock();
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}

}
});


this.setVisible(true);
pack();

}


public static void main(String args[])
{
rmiclient c = new rmiclient();

}



}
******************serverrmi******************
package rmi;
import java.rmi.*;
import java.rmi.registry.LocateRegistry;
import java.rmi.registry.Registry;


public class serverrmi extends java.rmi.server.UnicastRemoteObject
implements Rmiinterface
{

int thisPort;

String thisAddress;

Registry registry; // rmi registry for lookup the remote objects.
public String nom;
public String prenom;



// This method is called from the remote client by the RMI.

// This is the implementation of the “ReceiveMessageInterface”.
public void setPrenom(String p) throws RemoteException {
this.prenom=p;
}



public void setNom(String n) throws RemoteException {
this.nom=n;

}



public void print() throws RemoteException {
System.out.println("Nom: "+nom);
System.out.println("Prenom: "+prenom);

}



public serverrmi() throws RemoteException

{

try{

// get the address of this host.

thisAddress="127.0.0.1";

}

catch(Exception e){

throw new RemoteException("can't get inet address.");

}

thisPort=1099; // this port(registry’s port)

System.out.println("this address="+thisAddress+",port="+thisPort);

try{

// create the registry and bind the name and object.

registry = LocateRegistry.createRegistry( thisPort );

registry.rebind("rmiServer", this);

}

catch(RemoteException e){

throw e;

}

}



static public void main(String args[])

{

try{

serverrmi s=new serverrmi();
System.out.println("Serveur en marche");

}

catch (Exception e) {

e.printStackTrace();

System.exit(1);

}

}




}
******************Rmiinterface*************
package rmi;
import java.rmi.*;

public interface Rmiinterface extends Remote {
void setPrenom(String p) throws RemoteException;
void setNom(String n) throws RemoteException;
void print() throws RemoteException;

}

*************************implToken***************************
package rmi;

import java.net.InetAddress;
import java.net.UnknownHostException;
import java.rmi.RemoteException;
import java.rmi.registry.LocateRegistry;
import java.rmi.registry.Registry;
import java.rmi.server.UnicastRemoteObject;



public class implToken extends UnicastRemoteObject
implements Token
{

Registry registry;

protected implToken() throws RemoteException {
super();


try {
System.out.println("this address="+(InetAddress.getLocalHost()).toString()+",port="+1099);
} catch (UnknownHostException e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
}


try{

// create the registry and bind the name and object.

registry = LocateRegistry.getRegistry(1099);

registry.rebind("rmiServer"+Scritique.id, this);

}

catch(RemoteException e){

throw e;

}
}

public void sendtoken() throws RemoteException
{
Scritique.a_jeton=true;
Scritique.class.notifyAll();
}
public void gettoken(int idclient) throws RemoteException
{
Scritique.nbreq[idclient]++;
if(Scritique.a_jeton && !Scritique.using_jeton)
{
Scritique.stub[idclient].sendtoken();
}
}
}
*************************Token*****************
package rmi;

public interface Token extends java.rmi.Remote{
public void sendtoken() throws java.rmi.RemoteException;
public void gettoken(int idclient) throws java.rmi.RemoteException;
}
***********************Scritique****************
package rmi;

import java.net.MalformedURLException;
import java.rmi.Naming;
import java.rmi.NotBoundException;
import java.rmi.RemoteException;

public class Scritique {

public static boolean a_jeton=Boolean.parseBoolean(System.getProperty("a_jeton"));
public static boolean using_jeton=false;
public static int id=Integer.parseInt(System.getProperty("id"));
public static int nbclient = Integer.parseInt(System.getProperty("nbclient"));
public static Token stub[] = new Token[nbclient];
public static int nbreq[];
public static int jeton[];


static {
for (int i = 0; i < nbclient; i++) {
if (i != id) {
try {
stub[i] = (Token) Naming
.lookup("rmi://127.0.0.1:3333/rmiServer"+ (i + 1));
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}

}

}

public static void lock()
{
if(!a_jeton)
{
for(int i=0;i<nbclient;i++)
{
if(i!=id)
{
try {
stub[i].gettoken(id);
} catch (RemoteException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
try {
Scritique.class.wait();
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
using_jeton=true;
}
public static void unlock()
{
using_jeton=false;
for(int i=0;i<nbclient;i++)
{
if(nbreq[i]>jeton[i])
{
try {
stub[i].sendtoken();
} catch (RemoteException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
a_jeton=false;
}
}
}

}
Afficher la suite 

6 réponses

Répondre au sujet
Utilisateur anonyme - 13 déc. 2012 à 17:52
+3
Utile
Salut,

Content pour toi que ton problème a été résolu. Clique sur "Réponse acceptée" pour clore le sujet stp.

A+


--
Pylouq
Heureux sont ceux qui lisent le Réglement, ils ne finiront peut-être pas au bûcher.
Cette réponse vous a-t-elle aidé ?  
Commenter la réponse de Utilisateur anonyme
cs_Julien39 6449 Messages postés mardi 8 mars 2005Date d'inscription 15 mars 2018 Dernière intervention - 10 déc. 2012 à 08:35
0
Utile
Salut,

Je n'ai pas lu ton code, mais je pense qu'il faut que le processus bloqué se mette en attente du jeton et se lance une fois que le jeton a été rendu.

Je te conseil de chercher de la doc sur les thread en java.
Commenter la réponse de cs_Julien39
Utilisateur anonyme - 10 déc. 2012 à 22:13
0
Utile
Salut,

Quel est ton problème exactement ? Comme l'a dit Julien39, si tu veux simuler des processus Java, regarde du côté des Thread. Ton code étant vraiment gros, je n'ai pas eu le temps de tout lire. Voilà ce que je ferais vite fait (ça peut ne pas coller avec ce que tu fais/veux, mais dis nous aussi où ça coince) :

Je ferais une classe avec ta variable à mettre en exclusion mutuelle, cette variable étant private. A la limite je passerais par de la généricité pour faire une classe pouvant stocker dans sa variable des objets de n'importe quel type. A la limite cette classe peut faire office de sémaphore de type mutex. Tu fais deux méthodes, une P (permission/prise) et une V (libération). Tu fais un attribut de cette classe comptant le nombre de processus pouvant être sur ta ressource en private. Si un processus est bloqué, tu peux lui mettre un sleep ou un wait, regarde dans l'API Java s'il y a moyen de les faire s'endormir indéfiniment, et de les réveiller avec un signal. Sinon, tu peux mettre en place un pattern Observer/Observable mais je doute que tout ça se fasse bien au final car tu utilises RMI.


--
Pylouq
Heureux sont ceux qui lisent le Réglement, ils ne finiront peut-être pas au bûcher.
Commenter la réponse de Utilisateur anonyme
newgame 52 Messages postés lundi 2 février 2009Date d'inscription 24 juillet 2013 Dernière intervention - 11 déc. 2012 à 20:35
0
Utile
merci à tous ceux qui m'ont aidé et essayé de me donner des solutions, c bon mon problème est résolu l'erreur était dans le client RMI
en résumé le problème était surtout causé par l'invocation à distance
merci pour tout
Commenter la réponse de newgame
bébéprogrammeuse - 30 nov. 2013 à 11:03
0
Utile
1
Salut

ça m'interresse de connaitre exactement le problème car j'ai le meme TP et je n'arrive pas à le faire fonctionner.

Merci d'avance.
Commenter la réponse de bébéprogrammeuse

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.