Warten in einer Methode, bis Zeit abgelaufen, oder Methode erneut aufgerufen wurde

shibbyDo

Grünschnabel
Hi Leute,

ich habe ein Problem. Ich implementiere gerade ein Routing Algorithmus. Kurz zum Ablauf: Es werden Nachrichten zwischen den Routing Agenten verschickt, um eine effiziente Route zu finden. Die Anfrage vom Sender wird so lange weitergereicht, bis sie am Empfänger angekommen ist. Dabei kann es natürlich vorkommen, dass die Nachrichten unterschiedliche Routen zum Empfänger nehmen.

Die Nachrichten werden über die fireEvent() Methode verschickt und über die notify() Methode empfangen.

Nun zum Problem: In der notify Methode soll der Algorithmus, sagen wir 5 Sekunden, warten ob über diese notify() Methode nun erneut eine Nachricht reinkommt, die ggf. einen anderen Weg genommen hat.

Nun weiß ich allerdings nicht, wie ich das realisieren kann/soll und erhoffe mir von hier ein wenig Input.

Noch ein Hinweis: die RoutingAgenten erben bereits von einem AbstractAgent, so dass ich lediglich das Interface Runnable implementieren kann.
 
Jo dann bau einen eigenen Thread der eben dauerhaft auf die notify() Methode schaut sagen wir alle 100 MS und nach 5 Sekunden damit aufhört:

Beispielhaft hab ich da mal was gebaut:

package:
com.youza.logic

class 1: Main
Java:
package com.youza.logic;

public class Main {

	/**
	 * @param args
	 */
	protected static Notify notify = new Notify();
	public static void main(String[] args) {
		
		Thread watcherThread = new Thread(new Watcher());
		watcherThread.start();
		Thread notifyThread = new Thread(notify);
		notifyThread.start();
		
	}

}

class 2: Notify

Java:
package com.youza.logic;

import java.util.Random;

public class Notify implements Runnable{

	private String someInput;
	public Notify(){
		
	}
	public String getSomeInput() {
		return someInput;
	}
	public void setSomeInput(String someInput) {
		this.someInput = someInput;
	}
	@Override
	public void run() {
		
		someInput = "Meldung 1";
		Random random = new Random();
		int sleeptime = random.nextInt(50)*100;	
		try {
			Thread.sleep(sleeptime);
		} catch (InterruptedException e) {
			e.printStackTrace();
		}
		someInput = "Meldung 2";
		
	}
}

class 3:Watcher

Java:
package com.youza.logic;

import javax.swing.JOptionPane;


public class Watcher extends Main implements Runnable{

	int countLoops = 0;
	private int intervall = 0;
	private String actualValue = null;
	public Watcher(){
		
	}

	@Override
	public void run() {
		while(true){
			try {
				System.out.println(String.valueOf(countLoops));
				if(!(notify.getSomeInput()== null))				
				{
					if(actualValue == null)
						actualValue = notify.getSomeInput();
					else if(actualValue.equals(notify.getSomeInput())&&intervall < 5000)
						intervall += 100;
					else if(intervall < 5000)
					{
						JOptionPane.showMessageDialog(null, "Neue Nachricht innerhalb von 5 Sekunden:\n1. " + actualValue + "\n2. " + notify.getSomeInput() + "\nAbstand zwischen beiden Nachrichten:\n" + intervall + " ms");
						actualValue = notify.getSomeInput();
						intervall = 0;
					}
					else
					{
						notify.setSomeInput(null);
						JOptionPane.showMessageDialog(null, "Keine Neue Nachricht in den letzten 5 Sekunden!");
						intervall = 0;
					}
				} 
				Thread.sleep(100);
				countLoops++;
			} catch (InterruptedException e) {
				e.printStackTrace();
			}
		}
		
	}
}

Viele Grüße
Youza
 
Zurück