我想使用一个线程作为事件循环线程。我指的是具有“类似 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/