2014-06-20 83 views
-2

在java中,我們如何做到這一點:Java中的線程排序。

  1. 許多線程創建並寫入一個文件。
  2. 由於任何線程都可以寫入該文件(通過獲取鎖),線程寫入的順序就不存在了。

創建的線程數將超過40個。如何轉儲線程,只要它們的順序不受影響。

在此先感謝。

+0

我們**不要**這樣做。如果你不想併發,不要使用線程。 – Holger

回答

3

從你的描述來看,最簡單的解決方案是讓線程保存結果並讓另一個線程按照你的意圖編寫它們。例如

int threads = Runtime.getRuntime().availableProcessors(); 
ExecutorServer es = Executors.newFixedThreadPool(threads); 

List<Future<String>> results = new ArrayList<>(); 
for (int i = 0; i < tasks; i++) 
    results.add(es.submit(new Callable<String>() { 
      public String call() { 
       // task which returns a String 
      } 
    }); 
try (PrintWriter fw = new PrintWriter("output.txt")) { 
    for (Future f : results) 
     fw.println(f.get()); 
} 

正如你可以看到

  • 任務可以按任意順序執行,但結果寫在期待的順序文件。
  • 一次執行的任務數限於邏輯CPU的實際數量。
0

好吧,線程實際上並沒有一個順序,所以你需要爲它們編程創建某種池隊列。

雖然我不知道Java 1.7是否用它的java.concurrent Classes添加了新的東西..這可能會幫助你想要什麼。

但是對於Java 1.6及更低版本,您必須有一個隊列來逐個管理線程,以維護JVM不會執行的實際順序。