package elte.java2_utikalauz5.rmi; import java.rmi.Naming; import java.rmi.server.UnicastRemoteObject; import java.rmi.RemoteException; /** Ez egy tavolrol elerheto Mutex. @link.forrásfájl {@docRoot}/../data/rmi/src RMIMutex.java @link.letöltés {@docRoot}/../data/rmi RMIMutex.jar @since Java 2 Útikalauz programozóknak 1.3 */ public class RMIMutex extends UnicastRemoteObject implements RMIMutexInterface { /** Verziószám. */ private final static long serialVersionUID = 15L; public Mutex localMutex; // Ezt a mutexet tesszuk tavolrol elerhetove public RMIMutex() throws RemoteException { super(); // Távoli (konstruktor) objektum exportálasa localMutex = new Mutex(); // Letrehozzuk a tavolrol elerheto mutexet } // A mutex "lefoglal" muvelete. A folyamatok a kritikus szakaszba lepes // elott foglaljak le a mutexet. // Varakozik, amig nem lephet be a kritikus szakaszba. // Kivaltahato kivetelek: // java.rmi.RemoteException : ha a tavoli metodushivasi rendszer hibat eszlel // java.lang.InterruptedException : a mutex "lefoglalasa" sikertelen, mert // a wait() muveletnel valo varakozast valamilyen esemeny // megszakitotta. Ilyenkor erdemes ujra meghivni a Lefoglal() // tavoli metodust. public void Lefoglal() throws java.rmi.RemoteException, java.lang.InterruptedException { localMutex.Lefoglal(); } // A mutex korlatozott ideig varakozo "lefoglal" muvelete. // A folyamatok a kritikus szakaszba lepes elott foglaljak le a mutexet. // Varakozik, amig nem lephet be a kritikus szakaszba, vagy a metodus // parametereben ezredmasodpercekben megadott varakozasi ido le nem telik. // Kivaltahato kivetelek: // java.rmi.RemoteException : ha a tavoli metodushivasi rendszer hibat eszlel // java.lang.InterruptedException : a mutex "lefoglalasa" sikertelen, mert // a wait() muveletnel valo varakozast valamilyen esemeny // megszakitotta. Ilyenkor erdemes ujra meghivni a Lefoglal() // tavoli metodust. // Timeout : letelt a parameterben megadott varakozasi ido, es ezalatt // nem sikerult a mutex lefoglalasa. public void Korlatozottlefoglal(long ms) throws java.rmi.RemoteException, java.lang.InterruptedException, Timeout { localMutex.Korlatozottlefoglal(ms); } // Egy "lefoglalt" mutex felszabaditasat vegzo muvelet. // Nem ellenorzi, hogy a megadott mutex tenyleg "foglalt" allapotban van-e; // de egy robusztusabb implementacioban ezt meg lehetne tenni. public void Felszabadit() throws java.rmi.RemoteException, java.lang.InterruptedException { localMutex.Felszabadit(); } }