Java 线程作为事件循环线程
Java thread as an event loop thread
我想使用线程作为事件循环线程。我的意思是 Java 线程和 "QThread like behaviour"(下例中的 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
中的 "always-working" 主循环,每次 t1
中的新 Runnable
分配...我的程序可以调用 method
之类的东西每秒 40 次,所以我需要它是高效的。
我正在寻找也应该用于 Android 的解决方案(我知道 class Looper 用于 Android,但它仅用于 Android, 不可能)
考虑使用 BlockingQueue
而不是 Queue
的方法 take()
将阻塞线程直到队列中有元素可用,因此不会像 poll()
那样浪费周期确实。
您也可以同步(使用 synchronized / wait / notify)等待新事件发布。但在之前的回答中提到,BlockingQueue 可以完成这项工作。只是不要忘记在您打算退出线程时进行中断(在这两种情况下)。
从 Java 1.5 开始,就提供了一个出色的开箱即用的线程池解决方案。您有一个线程池,您可以向其提交任务以供执行。该池采用一个线程并执行您的任务。任务执行后,线程透明地 returns 到池中。请查看 ExecutorService interface and all its implementations. Also take a look at Executors 助手 class。这应该可以满足您的所有需求,甚至更多
我想使用线程作为事件循环线程。我的意思是 Java 线程和 "QThread like behaviour"(下例中的 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
中的 "always-working" 主循环,每次 t1
中的新 Runnable
分配...我的程序可以调用 method
之类的东西每秒 40 次,所以我需要它是高效的。
我正在寻找也应该用于 Android 的解决方案(我知道 class Looper 用于 Android,但它仅用于 Android, 不可能)
考虑使用 BlockingQueue
而不是 Queue
的方法 take()
将阻塞线程直到队列中有元素可用,因此不会像 poll()
那样浪费周期确实。
您也可以同步(使用 synchronized / wait / notify)等待新事件发布。但在之前的回答中提到,BlockingQueue 可以完成这项工作。只是不要忘记在您打算退出线程时进行中断(在这两种情况下)。
从 Java 1.5 开始,就提供了一个出色的开箱即用的线程池解决方案。您有一个线程池,您可以向其提交任务以供执行。该池采用一个线程并执行您的任务。任务执行后,线程透明地 returns 到池中。请查看 ExecutorService interface and all its implementations. Also take a look at Executors 助手 class。这应该可以满足您的所有需求,甚至更多