Java线程作为事件循环线程
我想使用一个线程作为事件循环线程。我指的是具有“类似QThread行为”的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>
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);
}