有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java递增线程名

我做了一个函数,它需要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();
        }

当使用线程进行检查时,线程数会按照预期的方式增加。activeCount(),但我不知道如何联系他们,因为我给所有人都分配了名称t,这使得很难再创建一个线程来等待他们的输出

我希望我的解释澄清了这个问题:/

编辑:

我的想法是,我会计算不同文件中的字数,每个文件都需要为自己分配一个线程来加速。除此之外,我希望一个线程等待所有其他线程的输出(这意味着我必须等待它们完成,因此我希望访问线程的名称)

最后,等待的最后一个线程将在关闭程序之前使用收集的数据进行自己的操作


共 (1) 个答案

  1. # 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());
    }