2016-10-10 2 views
0

Ich möchte einen Thread als Event-Loop-Thread verwenden. Ich meine einen Java-Thread mit einem "QThread-ähnlichen Verhalten" (t2 im folgenden Beispiel). Erklärung:Java-Thread als Event-Loop-Thread

Ich habe einen Thread t1 (Haupt-Thread) und einen Thread t2 (ein Worker-Thread). Ich möchte, dass method(), von t1 aufgerufen, in t2 Thread ausgeführt wird.

Derzeit habe ich diesen Code (es funktioniert, aber ich mag es nicht):

-Thread t1 (Hauptthread, UI-Thread zum Beispiel):

//... 
// Here, I want to call "method()" in t2's thread 
Runnable event = new Runnable() { 

    @Override 
    public void run() 
    { 
     t2.method(param); 
    } 
}; 
t2.postEvent(event); 
//... 

- Thread t2:

//... 
Queue<Runnable> eventLoopQueue = new ConcurrentLinkedQueue<Runnable>(); 
//... 
@Override 
public void run() 
{ 
    //... 
    Runnable currentEvent = null; 
    while (!bMustStop) { 
     while ((currentEvent = eventLoopQueue.poll()) != null) { 
      currentEvent.run(); 
     } 
    } 
    //... 
} 

public void method(Param param) 
{ 
    /* code that should be executed in t2's thread */ 
} 

public void postEvent(Runnable event) 
{ 
    eventLoopQueue.offer(event); 
} 

Diese Lösung ist hässlich. Ich mag nicht die "immer funktionierende" Hauptschleife in t2, die neue Runnable Zuordnung jedes Mal in t1 ... Mein Programm kann method so etwas wie 40 Mal pro Sekunde anrufen, so dass ich es effizient zu sein brauche.

Ich bin für eine Lösung, die auch auf Android verwendet werden soll (ich kenne die Klasse Looper für Android, aber es ist nur für Android, so unmöglich)

Antwort

2

Betrachten BlockingQueue statt Queue für seine Methode take() Blockiert den Thread, bis ein Element in der Warteschlange verfügbar ist, und verschwendet keine Zyklen wie poll().

0

Sie könnten auch synchronisieren (mit synchronized/wait/notify) warten, bis eine neue gerade gepostet wird. Aber in der vorherigen Antwort erwähnt, könnte die BlockingQueue die Arbeit machen. Vergiss nicht zu unterbrechen, wenn du den Thread beenden willst (in beiden Fällen).

0

Seit Java 1.5 gibt es eine hervorragende Lösung für das Thread-Pooling. Sie haben einen Thread-Pool, an den Sie eine Aufgabe zur Ausführung senden können. Der Pool nimmt einen Thread und führt Ihre Aufgabe aus. Sobald die Aufgabe ausgeführt wurde, kehrt der Thread transparent zum Pool zurück. Bitte schauen Sie sich die ExecutorService Schnittstelle und alle ihre Implementierungen an. Schauen Sie sich auch Executors Helfer Klasse. Dies sollte Ihnen alles geben, was Sie brauchen und vieles mehr

Verwandte Themen