2012-07-23 110 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 
      } 
     }); 
    } 
} 

这将排队上单个后台线程所有可运行(即下载)。