2012-07-23 79 views
2

我可以問一個菜鳥Java問題嗎?Java/Android:同步vs隊列實現

我正在從網上下載一些文件。這種方法下載(url位置)被多次調用。

public static void download(final String url) { 
    Thread t = new Thread("download") { 
     @Override 
     public void run() { 
      try { 
       synchronized (object) { 
        // download & save 
       } 
      } catch(Exception e) {} 
     } 
    }; 
    t.start(); 
} 

我添加了「同步」,以便下載一個接一個地發生。 (不是多次下載同時發生)。
即使download()被多次調用,synchronized也會阻塞其他線程直到第一個線程完成。

上面的代碼能工作嗎?還是我必須實現隊列?並一個接一個地出列?
可以同步塊「足夠」的線程? (30?50?)還是有限制?

回答

3

上面的代碼能工作嗎?

是,只要object是指在所有的線程相同的目的,在同步塊中的代碼將只由一個線程在一個時間執行。

[...]或我必須實施隊列嗎?並一個接一個地出列?

一般而言,我會建議你使用作爲高層次的結構儘可能(例如從java.util.concurrent包)。例如,你可以考慮使用執行者服務來處理這些類型的事情。

[...]可以同步塊「足夠」的線程嗎? (30?50?)還是有限制?

不,沒有限制。至少不接近30或50 :-)

0

如果你可以避免創建額外的線程,你通常應該這樣做。據我瞭解,你永遠不需要並行的兩個工作項目(下載),所以最好的想法,性能方面,是使用由單個工作線程輪詢的併發隊列實現。

3

這裏是如何做到這一點:

import java.util.concurrent.ExecutorService; 
import java.util.concurrent.Executors; 

public class QueueDownloader { 
    private final ExecutorService executor = Executors.newSingleThreadExecutor(); 
    public void download(final String url) { 
     executor.execute(new Runnable() { 
      @Override 
      public void run() { 
       // download & save 
      } 
     }); 
    } 
} 

這將排隊上單個後臺線程所有可運行(即下載)。