【问题标题】:Running multiple instances of thread class to read multiple files运行线程类的多个实例以读取多个文件
【发布时间】:2014-04-05 10:28:53
【问题描述】:

所以我有一个可调用的类,它处理给定的文本文件,然后生成一个输出文本文件。我想用自己的线程处理每个文件,但是我对使用相同对象启动线程与使用不同线程对象启动线程的区别感到困惑。除了输入文件不同外,两个线程都做完全相同的事情。最初我想使用一个线程对象,但如果我使用一个线程对象,我将如何加载不同的文件。

例如

    ExecutorService pool = Executors.newFixedThreadPool(2);

    Runner test = new Runner("file1.txt");

    Future<String> ret = pool.submit(test);

    Future<String> ret2 = pool.submit(test);

VS

    ExecutorService pool = Executors.newFixedThreadPool(2);

    Runner test = new Runner("file1.txt");

    Runner test2 = new Runner("file2.txt");

    Future<String> ret = pool.submit(test);

    Future<String> ret2 = pool.submit(test2);

我的问题/因素

  1. 上面的示例清楚地命名了文本文件,而在实际实现中这些文件是未知的,因此通过迭代循环访问。
  2. 如果我要使用单线程对象,那么我将如何处理不同的文件
  3. 如果使用两个单独的线程对象,那么我还需要担心同步问题。

提前致谢

【问题讨论】:

  • 在这里看不到任何 Thread 对象。我看到Runnable 的实例。我不知道您是否需要使用synchronized,因为您没有显示任何代码。此外,多线程文件 IO 是一种反模式 - 除非您对文件进行非常繁重的处理或某种 SSD RAID,否则它会使事情变慢。

标签: java multithreading functional-programming


【解决方案1】:

两种方法都可以:您可以为每个任务使用不同的对象,可以共享对象,还可以混合使用这两种方法。在大多数情况下,最简单的解决方案是为每个任务创建一个对象。您的示例也是如此。使用循环,我可能如下所示:

List<Future<String>> futures = new ArrayList<>();
for (String pathname : pathnames) {
    futures.add(pool.submit(new Runner(pathname));
}
for (Future<String> future : futures) {
    ...
}

也可以共享一个对象。但是,这有点复杂。

class Worker implements Callable<String> {
    private final List<String> pathnames;
    private final AtomicInteger index = new AtomicInteger();
    public Worker(List<String> pathnames) {
        this.pathnames = pathnames;
    }
    public String call() {
        String pathname = list.get(index.getAndIncrement());
        ...
        return ...;
    }
}

// caller
Worker worker = new Worker(pathnames);
List<Future<String>> futures = new ArrayList<>();
for (String pathname : pathnames) {
    futures.add(pool.submit(worker));
}

如您所见,worker 必须获取路径名,而不是将路径名传递给 worker,因为后者不能直接使用 执行器框架。还有一些同步的需要。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-08-20
    • 1970-01-01
    • 1970-01-01
    • 2011-12-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-06-29
    相关资源
    最近更新 更多