使用Future

时间:2017-05-22 18:47:53

标签: java multithreading asynchronous

我一般都是线程新手,所以在这里让我感到很沮丧。

我正在阅读以下有关线程和执行者的页面(12)。假设我想异步读取一个大文本文件并返回一个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)将文本文件异步读入列表然后迭代它的正确方法吗?

1 个答案:

答案 0 :(得分:1)

问题是主线程立即调用future.get(),因此阻止执行程序处理文件读取。所以实际上你使用2个线程,但一次只能使用一个(几乎所有时间)。

有关为什么要使用其他线程/并发的一些示例:

  1. 假设有另一个文件(或文件列表)要读取,那么您可以启动执行程序(不是单个线程)来并行读取多个文件。
  2. 假设这是一个巨大的文件,您希望将文件读取分成多个并发运行的任务。
  3. 假设有一个DB调用可以同时完成读取文件。你可以把它放在执行者的另一个任务中来处理或让主线程处理它。
  4. 等等。
  5. 记住我上面写的是有助于思考的例子。您需要做的是查看您的需求,然后设计和编写并发代码。在这种特定情况下,不需要并发(由于立即future.get()调用)。

    编辑1(根据您的意见):如果您的目标是了解编写异步任务,那么您的目标将通过您列出的人为实例得到满足。但是,您可以通过考虑我提供给您的示例或者您可以想到自己的一些示例来使其更加真实。