Software Scheduler

Teldec

Grünschnabel
Moin Moin,
ich habe vor nach dem starten gleich alle threads schlafen zulegen.
Aber ich bekomme hier immer einen Fehler den ich mir absolut nicht erklaeren kann.
java.lang.IllegalMonitorStateException.

Desweiteren sollen dann die userThreads[i] in regelmässigen Zeitabständen aufgeweckt werden etwas rechnen und sich dann wieder schlafen legen. Aber auch das scheitert da die for-Schleife in der while-Schleife nur einmal durchlaufen wird.

Code:
public void run(){
	 for (int i=0;i<thread;i++){ // generate the user Threads
		 userThreads[i]= new Thread(new workerThread());
		 userThreads[i].start();
	 }
	 while (true){
		 for (int i=0;i<thread;i++){
			 System.out.print(i+"|"+thread);
			 try {
				userThreads[i].wait(thread*timeSlice);
			} catch () {}{}
	 }
 }
 
Hallo!

Das ist ja auch kein Wunder, da du die Methoden wait/notify nur innerhalb eines synchronized Kontextes aufrufen kannst. Entweder innerhalb eines synchronized-Blocks oder einer synchronized Methode. Weiterhin muss der Thread der wait/notify an einem Objekt aufruft auch Besitzer ("Owner") des aktuellen Monitors sein.

Du solltest dir die Grundlagen zu Multithreading mal ein wenig genauer anschauen und für solche Arbeiten ein "richtiges" Job-Scheduler-Framework verwenden.
Wie beispielsweilse Quarz von Opensymphony:
http://www.opensymphony.com/quartz/

Gruss Tom
 
Hi,

hab mich jetzt da mal bissle schlau gemacht.
Hab jetzt auch nen synchronized Block eingebaut, der soweit ich das verstanden habe dafuer sorgt das der Code innerhalb des Blocks erst ausgefuert wird wenn der Thread einen Lock hat. Deshalb habe ich innerhalb des synchronized Blocks eingetragen das der Thread warten soll. Aber der läuft trotzdem weiter ... Gibts da noch was, was man beachten sollte?

Gruss Teldec
 
Hallo!

Code:
 /**
  * 
  */
 package de.tutorials;
 
 import java.util.Timer;
 import java.util.TimerTask;
 
 /**
  * @author Tom
  *
  */
 public class PeriodicallyAwakedWorkerThreadsExample {
 
 	/**
 	 * @param args
 	 */
 	public static void main(String[] args) {
 		final Object lock = new Object();
 		
 		Runnable workExecutor = new Runnable(){
 			public void run() {
 				int i = 0;
 				while(true){
 					synchronized(lock){
 						try {
 		    		    	lock.wait();
 		    			} catch (InterruptedException e) {
 		    		    	e.printStackTrace();
 						}
 					}
 					
 					for(int j = 0; j < 10; j++){
 		    		    System.out.println(Thread.currentThread().getName() + ": " + i++);
 						try {
 		    		    	Thread.sleep(500);
 		    			} catch (InterruptedException e) {
 		    		    	e.printStackTrace();
 						}
 					}
 				}
 			};
 		};
 		
 		Thread[] workerThreads = new Thread[5];
 		for (int i = 0; i < workerThreads.length; i++) {
 			workerThreads[i] = new Thread(workExecutor);
 		}
 		
 		Timer timer = new Timer();
 		timer.schedule(new TimerTask(){
 			public void run() {
 		    	System.out.println("awaking threads now... @" + System.currentTimeMillis());
 				synchronized (lock) {
 					lock.notifyAll();
 				}
 			};
 		},500L,20000L);
 		
 		for (int i = 0; i < workerThreads.length; i++) {
 			workerThreads[i].start();
 		}
 	}
 
 }

Eine Variante koennte beispielsweise so ausschauen... wie gesagt würde ich dir aber Empfehlen das mit einem "richtigen" Scheduler (quarz) und eventuell ein paar neuen Mittlen aus dem Java 5 java.util.concurrent package zu versuchen..

Gruss Tom
 
Zurück