2011-07-21 152 views
0

我有1個問題和2個選項的實現,我想知道哪一個是Android環境中最好的(基本最佳實踐,哪一個使用更少的電池)。線程和電池

我的問題: 我有4個Runnable實現,其中Runnable具有需要在單獨的線程中執行的任務列表。 這些Runnable將長時間沒有任務,然後執行很多任務(每個Runnable按順序執行其任務),然後長時間不執行任何操作,等等......

第一次執行

我的拳頭實現是創建4個線程。每個線程都充有1個Runnable。每個線程運行所有任務,當列表爲空時,Runnable暫停線程(使用wait()),當另一個任務被添加到列表時,線程被喚醒(使用notify())。 這裏是run方法爲可運行的代碼:

public void run() { 
    while (!terminated) { 
     while (taskList.size()> 0) { 
     Task task = taskList.get(0); 
     taskList.remove(task); 
     handleTask(task); 
     } 

     synchronized(taskList) { 
     if (taskList.size()==0) 
      taskList.wait(); 
     } 
    } 
    } 

第一個問題:使用太多的ressource處於暫停狀態的線程?

第二實施

在我的第二個實現我想到了用Executors.newCachedThreadPool(的)(如執行的AsyncTask)。基本上,當Runnable有任務運行並且系統負責爲我提供一個可用的線程並在一段時間不活動之後銷燬它時,我會問一個線程到池中。 因爲我4 Runnable接口將有很長一段沒有任務(execpt也許1 Runnable接口),我敢肯定我的池的行爲將是這樣的:

  • 總是1個線程忙
  • 創建1線程,刪除1個線程,
  • 創建2個線程,刪除2個胎面,
  • 創建1個線程...

線程可能永遠不會得到重用(除非我設置一個很長的閒置期)。

那麼最好的選擇是什麼?只有4個線程的大部分時間處於暫停狀態,或者創建/銷燬很多線程,但只有在我需要時纔會使用它們。

感謝您的幫助,

JimBoy。

回答

0

保持您的線程處於暫停狀態。這樣,他們不佔用任何資源。除非有工作要做,否則千萬不要讓線程忙碌。

然而,看看你在那裏做什麼,這聽起來像你可能想要看看一個BlockingQueue的子類。