使用线程池/线程读取大型txt文件?

关于我的上一个问题,我发布了:

我必须阅读几个非常大的txt文件,并且必须使用多个线程或一个线程来执行此操作,具体取决于用户输入。

假设我有一个主要方法来获取用户输入,并且用户请求一个线程,并希望为该线程处理20个txt文件。我将如何完成?请注意,以下内容不是我的代码或其设置,而是“想法”的含义。

例:

int numFiles = 20;

int threads = 1;

String[] list = new String[20];

for(int i = 1; i < 21; i++){

list[i] = "hello" + i + ".txt";//so the list is a hello1.txt, hello2.txt, ..., hello20.txt

}

public void run(){

//processes txt file

}

因此,总而言之,我将如何用一个线程完成此任务? 有20个线程?

用户建议使用threadPools:

当用户指定要使用的线程数时,您将适当地配置池,提交文件读取作业集,并让池对执行进行排序。

在Java世界中,您将使用Executors.newFixedThreadPool工厂方法,并将每个作业作为Callable提交。这是IBM关于Java线程池的文章。

所以现在我有了一个名为sortAndMap(String x)的方法,该方法接受一个txt文件名并进行处理,对于上面的示例,

Executors.newFixedThreadPool(numThreads);

如何将其与threadPools配合使用,以使上面的示例可行?

回答:

好吧,请允许我,因为我需要解释一些事情。

首先,除非您有多个磁盘或一个SSD磁盘,否则建议不要使用多个线程来读取磁盘。关于此主题的许多问题已经发布,结论是相同的:使用多个线程从单个机械磁盘读取将损害性能而不是提高性能。

发生上述情况是因为磁盘的机械头需要继续寻找下一个读取位置。使用多个线程意味着当每个线程都有机会运行时,它将把磁头定向到磁盘的不同部分,从而使磁头在磁盘区域之间的反射效率很低。

处理多个文件的公认解决方案是具有一个生产者(阅读器线程)-多个使用者(处理线程)系统。在这种情况下,理想的机制是线程池,其中线程充当生产者并将任务放入池队列中,以供工人处理。

像这样:

int numFiles = 20;

int threads = 4;

ExecutorService exec = Executors.newFixedThreadPool(threads);

for(int i = 0; i < numFiles; i++){

String[] fileContents = // read current file;

exec.submit(new ThreadTask(fileContents));

}

exec.shutdown();

exec.awaitTermination(Long.MAX_VALUE, TimeUnit.SECONDS);

...

class ThreadTask implements Runnable {

private String[] fileContents;

public ThreadTask(String[] fileContents) {

this.fileContents = fileContents;

}

public void run(){

//processes txt file

}

}

以上是 使用线程池/线程读取大型txt文件? 的全部内容, 来源链接: utcz.com/qa/402594.html

回到顶部