Java线程作为事件循环线程

时间:2016-10-10 15:03:33

标签: java multithreading qthread event-loop

我想将一个线程用作事件循环线程。我的意思是一个带有" QThread行为的Java线程" (以下示例中为t2)。说明:

我有一个线程t1(主线程)和一个线程t2(一个工作线程)。我希望从method()调用的t1t2帖子中执行。

目前,我制作了这段代码(它有效,但我不喜欢它):

-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,所以不可能)

3 个答案:

答案 0 :(得分:2)

考虑使用BlockingQueue代替Queue,因为它的方法take()会阻塞线程,直到队列中有一个元素可用,因此不会浪费poll()之类的循环。

答案 1 :(得分:0)

您也可以同步(使用synchronized / wait / notify)等待新的均匀发布。但在上一个回答中提到,BlockingQueue可以完成这项工作。当你打算退出线程时,不要忘记打断(在这两种情况下)。

答案 2 :(得分:0)

从Java 1.5开始,为线程池提供了一个开箱即用的优秀解决方案。您有一个线程池,您可以向其提交要执行的任务。池需要一个线程并执行您的任务。执行任务后,线程将透明地返回池。请查看ExecutorService界面及其所有实现。另请查看Executors帮助程序类。这应该为您提供所需的一切以及更多