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)