Realizzare il tipo di dato MiaCondizione definendo le operazioni
c.myDelay() e c.myContinue() usate dai processi per sincronizzarsi su
una condizione c.

public class MioMonitor {

	 /* Implements a monitor with two conditions by using
		 two monitors with one condition each (and a semaphore)  */

	 private MySemaphore mutex = new MySemaphore();

	 private MiaCondizione c1 = new MiaCondizione(mutex);
	 private MiaCondizione c2 = new MiaCondizione(mutex);

	 public void entryOne ()
	 throws InterruptedException {

		  mutex.myDelay();
		  System.out.println(Thread.currentThread().getName() +
										 ": I'm about to delay on c1.");
		  c1.myDelay();
		  System.out.println(Thread.currentThread().getName() +
										 ": I'm about to let continue on c2.");
		  c2.myContinue();
		  mutex.myContinue();
		  System.out.println(Thread.currentThread().getName() +
										 ": exiting the monitor.");
	 }

	 public void entryTwo()
	 throws InterruptedException {

		  mutex.myDelay();
		  System.out.println(Thread.currentThread().getName() +
										 ": I'm about to let continue on c1.");
		  c1.myContinue();
		  System.out.println(Thread.currentThread().getName() +
										 ": I'm about to delay on c2.");
		  c2.myDelay();
		  mutex.myContinue();
		  System.out.println(Thread.currentThread().getName() +
										 ": exiting the monitor.");
	 }
}


class MySemaphore {

	 /* Producer-consumer semaphores */

	 protected int count = -1;

	 public synchronized void myDelay ()
	 throws InterruptedException {
		  count++;
		  if (count > 0) wait();
	 }

	 public synchronized void myContinue ()
	 throws InterruptedException {
		  if (count >= 0) {
				count--;
				notify();
		  }
	 }
}


class MiaCondizione extends MySemaphore {

	 /* Implements conditions used by monitors */

	 private MySemaphore mutex;

	 MiaCondizione (MySemaphore s) {
		  mutex = s;
	 }

	 public void myDelay ()
	 throws InterruptedException {
		  synchronized (this) {
				count++;
				mutex.myContinue();
				wait();
		  }
		  mutex.myDelay();
	 }
}



--------------C4C63783A2C91CD7C4ECA828
Content-Type: text/plain; charset=us-ascii;
 name="TestMonitor.java"
Content-Transfer-Encoding: 7bit
Content-Disposition: inline;
 filename="TestMonitor.java"

class SomeProcess extends Thread {

	 MioMonitor M;
	 boolean typeOfProcess;

	 SomeProcess (String name, boolean t, MioMonitor sharedMonitor) {
		  super(name);
		  
		  M = sharedMonitor;
		  typeOfProcess = t;
	 }

	 public void run () {
		  try {
				if (typeOfProcess) M.entryOne();
				else M.entryTwo();
		  }
		  catch (InterruptedException E) {}
	 }
}


public class TestMonitor {
	 public static void main(String args[]) {

		  /* Tests MyMonitor */

		  MioMonitor M = new MioMonitor();

		  /* The shared monitor M is passed to the processes
			  as parameter */

		  new SomeProcess ("pippo", true, M).start();
		  new SomeProcess("pluto", false, M).start();
		  new SomeProcess("paperino", false, M).start();
	 }
}


Topic revision: r1 - 2001-12-17 - AntonioValletta






 
Questo sito usa cookies, usandolo ne accettate la presenza. (CookiePolicy)
Torna al Dipartimento di Informatica
This site is powered by the TWiki collaboration platform Powered by PerlCopyright © 2008-2024 by the contributing authors. All material on this collaboration platform is the property of the contributing authors.
Ideas, requests, problems regarding TWiki? Send feedback