我想将一个线程用作事件循环线程。我的意思是一个带有" QThread行为的Java线程" (以下示例中为t2
)。说明:
我有一个线程t1
(主线程)和一个线程t2
(一个工作线程)。我希望从method()
调用的t1
在t2
帖子中执行。
目前,我制作了这段代码(它有效,但我不喜欢它):
-Thread 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);
//...
-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);
}
这个解决方案很难看。我不喜欢&#34;永远工作&#34; t2
中的主循环,每次Runnable
的新t1
分配...我的程序可以每秒调用method
次40次,所以我需要它高效。
我正在寻找应该在Android上使用的解决方案(我知道Android的课程Looper,但它仅适用于Android,所以不可能)
答案 0 :(得分:2)
考虑使用BlockingQueue
代替Queue
,因为它的方法take()
会阻塞线程,直到队列中有一个元素可用,因此不会浪费poll()
之类的循环。
答案 1 :(得分:0)
您也可以同步(使用synchronized / wait / notify)等待新的均匀发布。但在上一个回答中提到,BlockingQueue可以完成这项工作。当你打算退出线程时,不要忘记打断(在这两种情况下)。
答案 2 :(得分:0)
从Java 1.5开始,为线程池提供了一个开箱即用的优秀解决方案。您有一个线程池,您可以向其提交要执行的任务。池需要一个线程并执行您的任务。执行任务后,线程将透明地返回池。请查看ExecutorService界面及其所有实现。另请查看Executors帮助程序类。这应该为您提供所需的一切以及更多