2017-02-18 70 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. 確保您鎖定訪問共享數據結構。這應該這樣做,因此訪問速度非常快,所以兩個線程都不會阻塞太久。

所以整個算法是啓動一個監視線程,開始管理的下載線程池中的一個工作代表團線程,具備監視線程接收新文件或設置文件下載的。鎖定您的共享數據的時間足夠長以更新待處理列表。讓下載管理器線程鎖定的時間足夠長,以便在工作人員可用時進行下一個任務。