2017-02-18 46 views
2

我运行两个线程的线程之一是阅读饲料和得到元素融入全局变量和其他线程被用来从全局变量的信息,并将其将开始下载文件。使两个线程不睡觉处理独立/等待/通知

WriteFile的线程的处理时间以毫秒正好和下载线程的处理时间可能需要长达比40秒多,因为它依赖于文件。

问题:

WriteFile的线程,因为我不有小姐这是给信息,每隔秒,但如果我运行下面的程序写文件线程是饲料运行每4secs完全没有执行,直到下载线程完成其进程。需要

溶液:

甚至下载线程的处理时间是1分钟以上由时刻i应该调用WriteFile的 15倍(15×4secs)。 (等待或睡眠方法会延迟我的过程,因为饲料在短短几小时内给我成千上万的文件)

请仔细阅读下面的代码。请编辑和分享知识。

在此先感谢这里

public class Upload { 
    static List<DTOs> list = new ArrayList<E>(); 
    String date = ""; 
    Map<String, DTO> map = new HashMap<String, DTO>(); 

    public static void main(String[] args) { 
     while (true) { 
      Thread writefile = new Thread() { 
       public void run() { 
        write(); 
        // map collection is being used in download thread and also 
        // list 
       } 
      }; 

      Thread download = new Thread() { 
       public void run() { 
        downloadProcess(list, date); 
       } 
      }; 

      writefile.start(); 
      download.start(); 

      try { 
       writefile.join(); 
       download.join(); 
      } catch (InterruptedException e) { 
       e.printStackTrace(); 
      } 
     } 
    } 
} 
+0

您集合不是线程安全的,你的线程只运行一次,为什么你有一个以上的线程,目前还不清楚,因为为你说一个运行速度与其他花费大部分的时间等待网络。 –

+0

@PeterLawrey一个线程正在读取数据源,并且与另一个线程相比速度很快。我开始while循环中的线程。 –

+0

我明白了,但这并没有说明我为什么要这样做,或者为什么这个集合不是线程安全的。提示:它更复杂,但不能保证更快。 –

回答

0

几点。

  1. 您的代码没有异步运行,因为您在每个循环的末尾加入了线程。这意味着主线程必须等待其他人完成每次。

  2. 没有理由每次重新创建线程。这是浪费的开销。

  3. 正如指出的那样,它没有出现,你正在以线程安全的方式处理你的数据结构。不知道为什么你要通过列表下载,因为它有一个全局静态实例。

你得到你想要的,我会做以下内容:

  1. 揭开序幕一个线程做饲料的监控。让它在线程内循环。

  2. 使用的下载线程工作池。没有理由不一次只能运行一个以上的下载,但您可能确实想要限制总数。

  3. 确保您锁定访问共享数据结构。这应该这样做,因此访问速度非常快,所以两个线程都不会阻塞太久。

所以整个算法是启动一个监视线程,开始管理的下载线程池中的一个工作代表团线程,具备监视线程接收新文件或设置文件下载的。锁定您的共享数据的时间足够长以更新待处理列表。让下载管理器线程锁定的时间足够长,以便在工作人员可用时进行下一个任务。