【问题标题】:Read a file asynchronously using Future使用 Future 异步读取文件
【发布时间】:2017-05-22 18:47:53
【问题描述】:

一般来说,我是线程的新手,所以在这里裸露一下。

我正在阅读以下有关线程和执行程序的页面(1,2)。假设我想异步读取一个大文本文件并返回一个 List 集合以进行迭代。

根据第二个链接:

java.util.concurrent.ExecutorService 接口代表一个 能够执行任务的异步执行机制 在后台。

考虑到这一点,我想出了以下代码示例:

文本文件(我知道文件太小,我们假设它有 100 多个名称):

Sally Solomon
Dick Solomon
Harry Solomon
Tommy Solomon

代码示例:

String fileName = "C://Users//Nexusfactor//Desktop//read.txt";

ExecutorService executorService = Executors.newSingleThreadExecutor();
Future<List<String>> future = executorService.submit(new Callable<List<String>>(){
    public List<String> call() throws Exception {
        List<String> lstofNames = new ArrayList<String>();
        try (Stream<String> stream = Files.lines(Paths.get(fileName))) 
        {
            lstofNames = stream.collect(Collectors.toList());
        } catch (IOException e) {
            e.printStackTrace();
        }
        return lstofNames;
    }
});
executorService.shutdown();

List<String> display = future.get();

for(String view : display){
    System.out.println(view);
}

这是使用ExecutorServiceFuturesubmit(Callable) 将文本文件异步读入列表然后迭代的正确方法吗?

【问题讨论】:

  • 抛开future.get() 阻塞特定线程,你有什么问题?
  • 没有。这只会让你的代码变慢,因为它现在必须创建一个执行程序,启动读取同一文件的第二个线程,等待线程完成读取,而不是等待从主线程读取文件,并且关闭执行器。您的代码仍然是同步的,但使用两个线程而不是一个线程,其中第一个线程阻塞并等待什么都不做,而第二个线程读取文件。
  • @JBNizet - 那我该如何纠正呢?
  • @KevinO - 我想学习如何异步读取文件。
  • 您首先要异步读取文件的原因是什么?如果你只是想让主线程在另一个线程读取文件时继续做某事,为什么不简单地让另一个线程读取并打印文件的内容?

标签: java multithreading asynchronous


【解决方案1】:

问题是主线程立即调用future.get() 并因此阻塞执行程序来处理文件读取。因此,实际上您正在使用 2 个线程,但一次只使用一个(几乎一直如此)。

关于为什么要使用另一个线程/并发的一些示例:

  1. 假设有另一个文件(或文件列表)要读取,那么您可以启动一个执行程序(不是单线程)来并行读取多个文件。
  2. 假设这是一个巨大的文件,您希望将文件的读取分解为同时运行的多个任务。
  3. 假设有一个可以在读取文件的同时完成的 DB 调用。你可以把它放在另一个任务中让执行器来处理,或者让主线程来处理它。
  4. 等等。

记住我上面写的都是帮助思考的例子。您需要做的是查看您的需求,然后设计和编写并发代码。在这种特定情况下,不需要并发(由于立即调用future.get())。

编辑 1(基于您的 cmets):如果您的目标是了解编写异步任务,那么您列出的人为示例可以满足您的目标。但是,您可以通过思考我提供给您的示例来使其更加现实,或者您可以自己思考一些。

【讨论】:

猜你喜欢
  • 2020-10-11
  • 2013-01-26
  • 1970-01-01
  • 2015-09-04
  • 2019-09-22
  • 2017-01-13
  • 2019-02-20
  • 2021-08-07
  • 2019-01-13
相关资源
最近更新 更多