Impressum · Kontakt · Hilfe
Besucher online · Mitglieder



Portal > Foren > Java > Allgemeine Java-Programmierung > Scheduler mit wait und notify
Antwort
 
Themen-Optionen
Alt 21.11.2005, 15:09   Nach oben    #1
Ybbus
Gast
 
Beiträge: n/a
Standard Scheduler mit wait und notify

Hi!

Wir sollen einen Scheduler-Thread bauen, der alle Rechenthreads aufnimmt und jedem eine bestimmte Zeit rechnen lässt, dann den nächsten usw...
Also im Round Robin Verfahren.

Das Problem ist nur, dass ich nicht genau weiß, wie ich das mit wait und notify mache.
Ich hab mir das so gedacht, dass der Scheduler-Thread ein array mit allen Threads hat, und dann einen Thread startet. Wenn dieser genug gerechnet hat schickt der SChed-Thread ihm ein Signal, damit er aufhört, und dem nächsten ein Signal, damit er weiterrechnet. Also zum aufhören bring man ihn wohl wenn der Thread wait() ausführt. Aber ich hab das prinzip nicht so ganz verstanden.

Führe ich dann in dem zu stoppenden Thread scheduler.wait aus, oder this.wait?

Ich hab es so gemacht:

Alle Threads liegen dem Scheduler ungestartet in einem Array vor.
Wird der Sched. gestartet, dann startet er alle Threads in einer schleife.
Die Threads führen alle zu anfang wait aus.

Das komische ist nur, dass das Programm abbricht, obwohl der Scheduler-Thread in einer endlosschleife läuft. Es gibt nicht eine Ausgabe.

Wenn ich jedoch die waits aus den Rechenthreads entferne läuft alles ganz normal, nur eben nicht gescheduled

Kann mir da jemand weiterhelfen?

MfG, Ybbus
 
Add Post to del.icio.usBookmark Post in TechnoratiDiesen Beitrag zu Mister Wong hinzufügen!
Mit Zitat antworten
Alt 21.11.2005, 15:33   Nach oben    #2
Benutzer
 
Registriert seit: 15.11.2005
Beiträge: 75
Standard

So ganz verstehe ich den Ansatz noch nicht - in der VM gibt es ja bereits einen Scheduler, der den verschiedenen Threads Rechenzeit zuteilt. Dieses Verhalten musst Du wohl irgendwie "aushebeln"...

Kannst Du Deinen Code posten (mit Code-Tags)?
Murray ist offline  
Add Post to del.icio.usBookmark Post in TechnoratiDiesen Beitrag zu Mister Wong hinzufügen!
Mit Zitat antworten
Alt 21.11.2005, 19:33   Nach oben    #3
Ybbus
Gast
 
Beiträge: n/a
Standard

Naja, wir sollen eben einen eigenen Scheduler simulieren.
Und das soll mit wait und notify geschehen.

Ich hab halt gedacht, dass man jeden Thread auf wait stellt, bis er ein notify bekommt. Wenn der nächste Thread dran ist macht der aktuelle wieder ein wait und der nächste beginnt wegen dem notify. Mein Code ist leider nicht richtig und bringt wohl nich so viel.

Also:

Scheduler Thread, der alle Rechenthreads in einem Array vorliegen hat.
Problem: Man soll mit Round Robin-Verfahren jedem Thread eine Zeitspanne zusichern, in der er rechnen darf. Das ganze soll mit wait und notify bewerkstelligt werden.
 
Add Post to del.icio.usBookmark Post in TechnoratiDiesen Beitrag zu Mister Wong hinzufügen!
Mit Zitat antworten
Alt 21.11.2005, 22:10   Nach oben    #4
Benutzer
 
Registriert seit: 15.11.2005
Beiträge: 75
Standard

Zitat:
Scheduler Thread, der alle Rechenthreads in einem Array vorliegen hat.
Problem: Man soll mit Round Robin-Verfahren jedem Thread eine Zeitspanne zusichern, in der er rechnen darf. Das ganze soll mit wait und notify bewerkstelligt werden.
M.E. erfordert das zumindest kooperative Rechenthreads ("kooperatives Multitasking" vs. "Präemptives Multitasking"); die Rechenthreads müssen also von sich aus hinreichend oft dem Scheduler Gelegenheit geben, einen anderen Thread laufen zu lassen. Dazu müssen die Thread selbst wait() aufrufen.
Murray ist offline  
Add Post to del.icio.usBookmark Post in TechnoratiDiesen Beitrag zu Mister Wong hinzufügen!
Mit Zitat antworten
Alt 22.11.2005, 06:09   Nach oben    #5
Ybbus
Gast
 
Beiträge: n/a
Standard

Also, das kann der Scheduler ja bestimmen, wann sie wait aufrufen sollen.
Es geht mir nur darum, wie ich wait und notify überhaupt sinnvoll benutze.
 
Add Post to del.icio.usBookmark Post in TechnoratiDiesen Beitrag zu Mister Wong hinzufügen!
Mit Zitat antworten
Alt 22.11.2005, 10:24   Nach oben    #6
Benutzer
 
Registriert seit: 15.11.2005
Beiträge: 75
Standard

Das könnte so aussehen:
Code:
/**
 * Simple test case for Thread-scheduling with wait/notify
 *
 */
public class Test {


	/**
	 * The Scheduler. It controls an array of worker-Threads
	 */
	public class Scheduler implements Runnable {
		Worker[] Workers;
		int Idx = -1;
		int TimeSlice;
	
		public Scheduler( int numThreads, int timeSlice) {
	
			TimeSlice = timeSlice;
			Workers = new Worker[ numThreads];
			for ( int i=0; i<Workers.length; i++) Workers[i] = new Worker();
		
		}
		
		public void start() {
			(new Thread( this)).start();
		}
		
		public void activateNext() {
			
			//--- Idx is -1 on first invocation (in this case there is no active thread yet)
			if ( Idx >= 0) Workers[Idx].passivate();
			
			//--- round-robin
			Idx++;
			if ( Idx >= Workers.length) Idx = 0; 
			
		    Workers[Idx].activate();	    	
		}
		
		public void run() {
			try {
				//--- endless loop
				while ( true) {
					activateNext();
					Thread.sleep( TimeSlice);
				}
			} catch (Exception e) {
				e.printStackTrace();
			}
		}
	
	}
	/**
	 * The Worker-Thread. It does some kind of calculation in a very time-consuming way
	 */
	public class Worker implements Runnable {
	
		public Object Lock = new Object();		
		private boolean Go;
		private long Data;
		
		public Worker() {
			//--- start the thread but don't start calulating yet
			Go = false;
			(new Thread( this)).start();
		}
		
		/**
		 * Make this Worker the active one -> start calculating
		 */
		public void activate() {
			try {
				synchronized( Lock) {
					Go = true;
					Lock.notify();
				}
			} catch ( Exception e) {
				e.printStackTrace();
			}
		}
		
		/**
		 * Temporarily stop calculating (Thread is still running!)
		*/
		public void passivate() {
			Go = false;
		}
		
		public void run() {
		
			try {
				//--- endless loop
				while ( true) {
					synchronized( Lock) {
		 			//--- cooperative multitasking: we have to periodically check if the Scheduler wants us to stop
						while( Go) {
		 		 	Data = Data + 1;
		 		 	System.out.println( this + ":" + Thread.currentThread() + " Data=" + Data);
						}
		 			//--- we have been passivated (Go = false) and now have to wait until we are activated again
						Lock.wait();
					}
				}
			} catch ( Exception e) {
				e.printStackTrace();
			}
		}
	}

	
	public Test() {
	
		Scheduler s = new Scheduler( 4, 1000);
		s.start();
	}
	
	public static void main( String[] args) {
		new Test();
	}
	
}
Murray ist offline  
Add Post to del.icio.usBookmark Post in TechnoratiDiesen Beitrag zu Mister Wong hinzufügen!
Mit Zitat antworten
Antwort

Lesezeichen


Aktive Benutzer in diesem Thema: 1 (Registrierte Benutzer: 0, Gäste: 1)
 
Themen-Optionen

Forumregeln
Es ist Ihnen nicht erlaubt, neue Themen zu verfassen.
Es ist Ihnen nicht erlaubt, auf Beiträge zu antworten.
Es ist Ihnen nicht erlaubt, Anhänge hochzuladen.
Es ist Ihnen nicht erlaubt, Ihre Beiträge zu bearbeiten.

BB-Code ist An.
Smileys sind An.
[IMG] Code ist An.
HTML-Code ist Aus.
Trackbacks are An
Pingbacks are An
Refbacks are Aus

Ähnliche Themen
Thema Autor Forum Antworten Letzter Beitrag
Thread-Problem mit wait() eyeless Allgemeine Java-Programmierung 1 15.12.2005 22:22


Alle Zeitangaben in WEZ +2. Es ist jetzt 19:07 Uhr.

Nach oben
Wir nutzen das Zend Framework, vBulletin (vBulletin v3.7.3, Copyright ©2000-2008, Jelsoft Enterprises Ltd.
Search Engine Optimization by vBSEO 3.2.0) und vBSEO.

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44