公共同步void run()是个坏主意吗?

时间:2013-09-08 21:36:30

标签: java android multithreading

我有一个扩展Thread下载文件的类。我想确保一次只发生一次下载,所以我有一个类的静态引用,并在创建新引用之前检查它是否为null。但是偶尔我会注意到创建了这个类的另一个实例,因此在另一个线程上下载。我试图找出可能导致这种情况的原因,但是,通常将Thread的run()方法标记为synchronized(或调用start()的方法)是不是一个坏主意?是否有任何副作用需要注意?

4 个答案:

答案 0 :(得分:1)

如果你想在任何时候运行限制下载次数你应该使用信号量机制这样你可以扩展下载次数,你不需要以这种方式进行任何同步运行,如果你需要两次下载运行也是如此你只需增加你的信号量大小

答案 1 :(得分:1)

您需要确保在JVM的生命周期中只创建所述对象的单个实例。为此,有一个非常着名的单身人士模式,以确保这一点。

使构造函数成为私有的。提供静态工厂方法来创建实例。

示例:

Downloader{

  private static volatile Downloader iDownloader=null; 
  private Downloader(){
  }

 public static Downloader createDownloader(){
     if(iDownloader==null){
     synchronized(Downloader.class){
      if(iDownloader==null)
       iDownloader=new Downloader();
       }
      }
  return iDownloader; 
}

}

答案 2 :(得分:0)

是的,您需要同步访问静态标志。用synchronized方法做到这一点很好。但是,当你完成所有工作后,你将实现锁定。那么看看Java Lock class。启动文件传输的方法需要在启动下载线程之前获取锁。线程在下载完成或失败后释放。正如文档所指出的那样,必须100%确定地发布,否则将阻止所有下载。

答案 3 :(得分:0)

您可以使用Android Framework中的Looper类使您的线程成为管道线程,并通过Handler实例将您的下载请求排入队列

这是一个很好的教程,可以帮助你 http://mindtherobot.com/blog/159/android-guts-intro-to-loopers-and-handlers/