2016-10-10 79 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幫手類。這應該給你所有你需要和更多