2014-12-10 72 views
1

我已經做了一個函數,它需要x個參數。每個參數代表一個文件。增量線程名稱

我希望爲這些文件中的每一個都分配一個線程,以便儘可能快地計算文件的字數。目前我已經做了一些似乎工作,但我發現自己有麻煩檢查線程,因爲他們都分配了名稱「t」

這將是很好的以某種方式增加線程的名稱。第一個線程將是t1,並將分配給第一個文件,依此類推。

for (File file : fileList) { 
      final File f = file; 
      Thread t = null; 
      ThreadGroup test = null; 
      Runnable r = new Runnable() { 
       public void run() { 
        Scanner fileScan; 
        try { 
         fileScan = new Scanner(f); 
        } 
        catch(FileNotFoundException e){ 
         System.out.println("Something went wrong while accessing the file"); 
         return; 
        } 
        int words = 0; 
        while (fileScan.hasNext()) { 
         words++; 
         fileScan.next(); 
        } 
        System.out.println(f.getName() + ": " + words + " words"); 
        System.out.println(Thread.activeCount() + ": "); 
       } 
      }; 
      t = new Thread(r); 
      t.start(); 
     } 

的經緯密度上升,因爲它與Thread.activeCount()檢查時應該的,但我不知道如何聯繫過他們,因爲我有名字T,這使得它很難使所有分配而另一個線索則要等待他們的輸出。

我希望我的解釋澄清的問題:/

編輯:

的想法是,我將計算在不同的文件中的單詞量,每一個文件需要被分配一個線程用於本身的速度它起來。除此之外,我想要一個線程等待所有其他線程的輸出(這意味着我將不得不等待它們完成,因此爲什麼我會訪問線程的名稱)。

最後一個等待的線程將在關閉程序之前將收集的數據用於自己的操作。

+2

我不知道如果我理解得很好,但你不能只用'新主題(R,「名」)'? – 2014-12-10 22:16:46

+0

我想你需要澄清你想要做什麼,你想訪問線程?究竟如何?你可以在't = new Thread(r);'do'myList.append(t)'之後創建'List ';或者你可以使用映射並將文件名映射到線程指針? – RAEC 2014-12-10 22:19:41

+0

天哪,這聽起來像一個[XY問題](http://mywiki.wooledge.org/XyProblem),特別是人爲地使用一個字符串來保存其他地方更好的信息。爲什麼不使用CountDownLatch或類似的構造? – 2014-12-10 22:21:57

回答

1

爲了例如等待線程完成,您需要保存對您創建的線程的引用。你可以舉例

List<Thread> threads = new ArrayList<>(); 

然後在循環結束時做threads.add(t);

,你可以等着他們

後做

for (Thread t : threads) { 
    t.join(); 
} 

什麼問題不過是,有沒有辦法讓你讀你已經開始線程的結果來完成。

一個更好的方法這是使用ExecutorServiceThreadPoolExecutor。通過這種方式,您可以提交Callable<Integer>而不是Runnable,您將能夠得到單詞計數的結果。

這裏有一個輪廓,讓你開始:

ExecutorService service = Executors.newFixedThreadPool(numThreads); 
List<Future<Integer>> results = new ArrayList<>(); 
for (File f : fileList) { 
    results.add(service.submit(new Callable<Integer>() { 
     // ... 
    })); 
} 

for (Future<Integer> result : results) { 
    System.out.println("Result: " + result.get()); 
}