2016-10-10 29 views
0

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

我有一个线程t1(主线程)和一个线程t2(工作线程)。我想从t1调用method(),在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); 
//... 

- 螺纹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中使用的解决方案太(我知道的Android类Looper,但它仅适用于Android,所以不可能)

回答

2

考虑使用BlockingQueue代替Queue其方法take()会阻塞线程,直到队列中有一个元素可用,因此不会像poll()那样浪费周期。

0

你也可以同步(使用同步/等待/通知)等到一个新的偶数发布。但在前面的回答中提到,BlockingQueue可以完成这项工作。当你计划退出线程时,不要忘记中断(在这两种情况下)。

0

自Java 1.5以来,为线程池提供了一个极好的解决方案。您有一个线程池,您可以将该线程池提交给执行任务。池需要一个线程并执行您的任务。一旦任务执行完毕,Thread就会透明地返回到池中。请看ExecutorService界面及其所有实现。也看看Executors帮手类。这应该给你所有你需要和更多