Java线程作为事件循环线程

Java线程作为事件循环线程,java,multithreading,qthread,event-loop,Java,Multithreading,Qthread,Event Loop,我想使用一个线程作为事件循环线程。我指的是具有“类似QThread行为”的Java线程(在下面的示例中为t2)。说明: 我有一个线程t1(主线程)和一个线程t2(工作线程)。我希望在t2线程中执行从t1调用的method() 目前,我编写了此代码(它可以工作,但我不喜欢): -线程t1(主线程,例如UI线程): -线程t2: //... Queue<Runnable> eventLoopQueue = new ConcurrentLinkedQueue<Runnable>

我想使用一个线程作为事件循环线程。我指的是具有“类似QThread行为”的Java线程(在下面的示例中为
t2
)。说明:

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

目前,我编写了此代码(它可以工作,但我不喜欢):

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

-线程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);
}
/。。。
Queue eventLoopQueue=新建ConcurrentLinkedQueue();
//...
@凌驾
公开募捐
{
//...
Runnable currentEvent=null;
而(!bMustStop){
而((currentEvent=eventLoopQueue.poll())!=null){
currentEvent.run();
}
}
//...
}
公共作废方法(Param-Param)
{
/*应该在t2线程中执行的代码*/
}
公共void postEvent(可运行事件)
{
eventLoopQueue.offer(事件);
}
这个解决方案是丑陋的。我不喜欢
t2
中的“始终工作”主循环,每次
t1
中的新
Runnable
分配。。。我的程序可以每秒调用
方法
大约40次,所以我需要它来提高效率


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

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

您也可以同步(使用synchronized/wait/notify)以等待新的偶数发布。但是在前面的回答中提到,阻塞队列可以完成这项工作。当您计划退出线程时(在这两种情况下),请不要忘记中断。

因为Java 1.5提供了一个非常好的现成的线程池解决方案。您有一个线程池,可以向其中提交任务以执行。池接受一个线程并执行您的任务。任务执行后,线程将透明地返回池。请查看接口及其所有实现。还可以看看helper类。这会给你所有你需要的,还有更多

//...
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);
}