Exclusion mutuelle avec jeton

Résolu
newgame Messages postés 52 Date d'inscription lundi 2 février 2009 Statut Membre Dernière intervention 24 juillet 2013 - 8 déc. 2012 à 19:20
 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;
}
}
}

}

5 réponses

Utilisateur anonyme
13 déc. 2012 à 17:52
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.
3
cs_Julien39 Messages postés 6414 Date d'inscription mardi 8 mars 2005 Statut Modérateur Dernière intervention 29 juillet 2020 371
10 déc. 2012 à 08:35
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.
0
Utilisateur anonyme
10 déc. 2012 à 22:13
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.
0
newgame Messages postés 52 Date d'inscription lundi 2 février 2009 Statut Membre Dernière intervention 24 juillet 2013
11 déc. 2012 à 20:35
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
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
bébéprogrammeuse
30 nov. 2013 à 11:03
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.
0
bébéprogrammeuse
30 nov. 2013 à 11:43
@newgame
0
Rejoignez-nous