Java 线程作为事件循环线程

Java thread as an event loop thread

我想使用线程作为事件循环线程。我的意思是 Java 线程和 "QThread like behaviour"(下例中的 t2)。解释:

我有一个线程 t1(主线程)和一个线程 t2(辅助线程)。我希望从 t1 调用的 method()t2 线程中执行。

目前,我制作了这段代码(它可以工作,但我不喜欢它):

-线程t1(主线程,例如UI线程):

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

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

-线程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);
}

这个解决方案很丑陋。我不喜欢 t2 中的 "always-working" 主循环,每次 t1 中的新 Runnable 分配...我的程序可以调用 method 之类的东西每秒 40 次,所以我需要它是高效的。

我正在寻找也应该用于 Android 的解决方案(我知道 class Looper 用于 Android,但它仅用于 Android, 不可能)

考虑使用 BlockingQueue 而不是 Queue 的方法 take() 将阻塞线程直到队列中有元素可用,因此不会像 poll() 那样浪费周期确实。

您也可以同步(使用 synchronized / wait / notify)等待新事件发布。但在之前的回答中提到,BlockingQueue 可以完成这项工作。只是不要忘记在您打算退出线程时进行中断(在这两种情况下)。

从 Java 1.5 开始,就提供了一个出色的开箱即用的线程池解决方案。您有一个线程池,您可以向其提交任务以供执行。该池采用一个线程并执行您的任务。任务执行后,线程透明地 returns 到池中。请查看 ExecutorService interface and all its implementations. Also take a look at Executors 助手 class。这应该可以满足您的所有需求,甚至更多