2010-06-04 3 views
7

Ich möchte ein Design in Java implementieren, wo ich mehrere Ereignisquellen (Threads) habe. Eine solche Ereignisquelle führt eine bestimmte Aufgabe aus und musste den eindeutigen Ereignishandler (Klasse) benachrichtigen, und dieser muss andere Aufgaben entsprechend den Ereignisquellenbenachrichtigungen ausführen.Java, Entwurfsmuster: Mehrere Ereignisquellen und ein Event Handler

Meine Frage ist: Wie implementiert man dieses Desiqn in geeigneter Weise in Java? Gibt es ein Entwurfsmuster, das diesem Entwurf ähnlich ist?

Vielen Dank im Voraus :).

+0

Lol @ Antworten: 3 verschiedene Muster !!! – Pindatjuh

+0

Kannst du mir einen geben ?? – Zakaria

+0

gute Frage ich hätte nur einen synchronisierten Block in einer Callback-Methode der Handler-Klasse verwendet – fasseg

Antwort

3

Ich denke, Sie suchen nach dem Muster Observer. Java hat einige Standardschnittstellen (java.util.Observer, java.util.Observable), obwohl diese nicht typspezifisch sind; Sie könnten also Ihre eigenen betrachten, wenn die Domain dies zu erfordern scheint.

class MyThread implements Runnable { 
Observable observable; 

public MyThread(EventHandler observer) { 
    observable = new Observable(); 
    observable.addObserver(observer); 
} 

public void run() { 
    while (!done()) { 
    Object result = doStuff(); 
    observable.notifyObservers(result); 
    } 
} 
} 

// might have this be singleton 
class EventHandler implements Observer { 
public synchronized void update(Observable o, Object arg) { 
    accomplishOtherTask(); 
} 
} 
+0

Danke Justin für Ihre Antwort. Ich versuchte diese Lösung, aber das Problem war in Threads (wer als Observable betrachtet werden), weil meine Threads bereits von einer anderen Klasse erstreckt, und wenn Sie Observable verwenden möchten, müssen Sie daraus erweitern, und wie Sie wissen, ist Mehrfachvererbung nicht zulässig in Java. Haben Sie einen Vorschlag? – Zakaria

+0

Ihr Thread kann ein Observable enthalten oder Sie können Ihre Basisklasse Observable erweitern lassen. Die Verwendung von lauffähigem (anstatt sich erstreckendem Thread) wird hierfür unter anderen Gründen bevorzugt. – Justin

+0

Danke! Ich verstehe Ihre Idee und ich habe es umgesetzt. Aber ich verstehe wirklich nicht Ihr Codebeispiel: Zuerst können wir Observable nicht implementieren wir müssen es erweitern. Wahrscheinlich meinst du Beobachter. Wenn dies der Fall ist, ist Ihr Codebeispiel in Ordnung. – Zakaria

0

Klingt wie ein Schauspieler Muster für mich. Jeder Thread fungiert als Akteur, der eine einzelne Aufgabe erfüllt. Das Ergebnis wird in einer Warteschlange (Ja) festgelegt, die vom nächsten Akteur verarbeitet werden soll.

Ich habe jedoch keine Erfahrung mit Java-Actor-Frameworks. Wenden Sie sich an Google.

+0

Danke Arjan Molenaar für Ihr Interesse. Ich google für Actor-Frameworks in Java, können Sie mir weitere Erklärungen geben? – Zakaria

0

In GWT wird dies event bus genannt. Entweder GWT. HandlerManager oder GWTx. PropertyChangeSupport sind von Google empfohlene Implementierungen. Letzteres ist in J2SE seit 1.4.2 verfügbar.

+0

Vielen Dank für Ihre Antwort. Kann ich diese Implementierungen für nicht GUI-Ereignisse verwenden? – Zakaria

+0

Ein HandlerManager ist nur eine Warteschlange von Beobachtern. Wenn ein Ereignis im HandlerManager ausgelöst wird, überprüft der Manager jeden Beobachter, ob er auf das Ereignis reagieren kann. Wenn dies möglich ist, wird der Overserver mit den richtigen Argumenten usw. aufgerufen. –

+0

Ja, Zakaria, java.beans.PropertyChangeSupport kann für nicht-GUI-Ereignisse verwendet werden. – Glenn

0

Vielleicht verstehe ich Ihre Frage nicht, aber ich denke, dass Sie kein Designmuster benötigen, aber etwas aus dem java.util.concurrent Paket.

Ein ThreadPoolExecutor?

0

Observable Muster hat keine Meinung über Threading. In EventThread pattern kann der Listener angeben, in welchem ​​Thread und wann das Ereignis behandelt wird.

public class MyObservableObject { 
    ... 
    void addListener(MyListener listener, Executor executor); 
} 
public interface MyListener { 
    void onEvent(Object sender, Object event); 
} 

// Example 
obj.addListener(myListener, CURRENT_THREAD); 
obj.addListener(myListener, myWorkQueue); 
obj.addListener(myListener, AWT_EDT); // or SWT_EDT 
obj.addListener(myListener, Executors.newSingleThreadScheduledExecutor());