2016-06-21 33 views
0

我是線程新手,我經歷了堆棧溢出的許多帖子,併爲我的問題找到了很多解決方案,但我不確定哪一個最適合哪種情況。如何在所有線程完成時運行代碼

第一件事,第一,我的問題是,我想更新一個JSON文件 當所有線程都在一個特定的路徑與位圖代這樣做 我可以得到所有這些圖像和更新JSON文件。所以在 簡單的話我想運行一些代碼,當所有的線程完成它 執行和主要要求是,我不希望我的主要被阻止,因爲這一點。

我有什麼發現

  • 線程。加入
  • excutorServive
  • Android的優先級jobQueue (link)
  • 互斥的線程池(也讓我知道如果任何其它有)

我很困惑哪一個是解決的最好辦法我的問題。如果有任何 android專家有可以總結,以下兩個 scenerio什麼是Android中最好的可用。

  • 等待,當所有線程完成
  • 不要等待,得到通知時,所有完成

回答

0

你可以有你的線程計數器,在每個線程完成檢查多少,直到已經完成了,如果不是全部完成,遞增已完成線程的數量,最後完成的線程將運行這段代碼。

+0

您是否可以在使用中更具描述性。我不知道有多少線程正在運行。它也是一個變量。正如我不知道;不知道會有多少位圖生成。第二件事,我希望它從我的應用程序完全獨立的模塊。如何才能知道線程已完成?因爲我需要在一個線程中有一個while循環(糾正我,如果我錯了) – RATHI

+0

@RATHI擴展KgaboL的答案,同一時刻你開始一個線程,你可以增加一個計數器(設置在靜態類,如果你想)。當一個線程結束時,減少該計數器,並檢查它是否等於零。當它爲零時,這意味着所有的線程都消失了。您仍然需要考慮在不再需要一組線程時發生的情況(例如,延遲加載一些不再顯示在屏幕上的圖像),例如確保最終作業不會執行,除非您再次創建線程, 或類似的東西。 – Korcholis

+0

@Korcholis謝謝你的回答,這種方法可以使用什麼,我正在考慮和一個線程池執行器一起使用。實際上我對此感到困惑,不想在未來的晚些時候再次跳到另一種方法。 – RATHI

0

你可以這樣做。

在你的線程:

private Runnable runnableThread= new Runnable() { 
    @Override 
    public void run() { 
     try { 
      if (lastThreadDone){ 
       handler.sendEmptyMessage("SUCCESS"); 
      } 
     } 
     catch (Exception ex) { 
      throws ex; 
     } 
    } 
}; 

lastThreadDone是布爾值,如果這個過程完成,這將成爲現實,這是你如何實現它的基礎。

然後在你的處理程序:

@SuppressLint("HandlerLeak") 
private Handler handler = new Handler() { 
    @Override 
    public void handleMessage(Message msg) { 
     try { 
      switch (msg.what) { 
       case "SUCCESS": { 
        // your code here 
        break; 
       } 
       case "FAIL": 
        break; 
       default: 
        break; 
      } 
     } 
     catch (Exception ex) { 
      throw ex; 
     } 
     super.handleMessage(msg); 
    } 
}; 
+0

這就是問題我想你怎麼會知道最後一個線程已經完成?最後一個排隊的線程並不總是最後一個執行的線程。不是嗎?假設我已經開始了6個線程,並且在所有這六個結束時我應該得到這個消息。所以我可以想到的是,我可以有一個計數的互斥體,當每個線程完成執行時,我可以減少這個計數,當最後一個線程運行的時候,我可以發送這個消息給處理程序。但是這需要很多併發性,我需要處理。 – RATHI

+0

我認爲這是一個衆所周知的問題,應該有一些很好的選擇,以方便在android中處理這件事。糾正我,如果我從android除外太多。 :P – RATHI

+0

現在最喜歡線程的限制。我建議嘗試Asynctask這是更適合您的問題的解決方案,請參閱http://stackoverflow.com/a/24228697/5870896 –

0

我會用一個completion service然後輪詢,直到所有任務完成。完成後,json文件會被更新。問題是,你需要做這個異步或你冒險阻止用戶界面。因此,我將在intent service內封裝完成服務的工作。如果您需要更新UI,您可以從意向服務中發佈local broadcasts

而且對你的情況

  • 等到當所有線程完成

    • 只有做到這一點,當你已經在後臺線程同樣的意圖服務或異步任務
  • 不要等待,並在所有完成時得到通知

+0

謝謝你的答案,這是看起來有希望的,但從該線程,「基本上你使用一個CompletionService,如果你想並行執行多個任務,然後與他們完成工作所以,如果我執行5個任務,CompletionService會給我第一個完成的任務,「我不需要每個線程順序都是明智的結果,我想要知道他們完成了 – RATHI

+0

將線程池裏面意圖服務也是一個很好的選擇? – RATHI

+0

當然,無論符合目的。至於完成服務,它確實返回完成的第一個任務,但您可以提交任務次數與提交任務相同。當拉計數器與提交計數器相匹配時,您知道每個任務都已執行。使用意向服務時,請記住意圖服務在執行後會被銷燬,因此不要依賴任何狀態。 – GPuschka

相關問題