Exclusion mutuelle avec jeton [Résolu]

Messages postés
52
Date d'inscription
lundi 2 février 2009
Statut
Membre
Dernière intervention
24 juillet 2013
- - 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 

5 réponses

Meilleure réponse
3
Merci
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.

Dire « Merci » 3

Quelques mots de remerciements seront grandement appréciés. Ajouter un commentaire

Codes Sources 207 internautes nous ont dit merci ce mois-ci

Commenter la réponse de Utilisateur anonyme
Messages postés
6413
Date d'inscription
mardi 8 mars 2005
Statut
Modérateur
Dernière intervention
17 mai 2018
250
0
Merci
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
0
Merci
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
Messages postés
52
Date d'inscription
lundi 2 février 2009
Statut
Membre
Dernière intervention
24 juillet 2013
0
Merci
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
0
Merci
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