2014-12-10 81 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()); 
}