Java线程作为事件循环线程

标签 java multithreading qthread event-loop

我想使用一个线程作为事件循环线程。我指的是具有“类似 QThread 行为”的 Java 线程(以下示例中的 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 中“始终工作”的主循环,每次在 t1 中分配新的 Runnable...我的程序每秒可以调用 method 大约 40 次,所以我需要它高效。

我正在寻找一个也应该在 Android 上使用的解决方案(我知道 Android 的类 Looper,但它仅适用于 Android,所以不可能)

最佳答案

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

关于Java线程作为事件循环线程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39961269/

相关文章:

java - JSF 2.0 启动时出错

java - hibernate查询缓存和时间戳

java - Maven 连接到 IDE

c - pthread - sleep 阻止其他线程执行

c# - 使用对象而不是 this 获取锁 - 线程

c++ - QtConcurrent:为什么releaseThread和reserveThread会导致死锁?

java - sonarqube java规则不是扩展类应该是最终的

.net - 如何在没有缓冲区的情况下同时将 .NET 流写入另外两个流?

python - Pyqt5 中的 QThreads : is this the correct C++ to Python translation of the official QThread docs?

c++ - 等待 qthread 终止的正确方法是什么?