【发布时间】: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);
}
这是使用ExecutorService、Future 和submit(Callable) 将文本文件异步读入列表然后迭代的正确方法吗?
【问题讨论】:
-
抛开
future.get()阻塞特定线程,你有什么问题? -
没有。这只会让你的代码变慢,因为它现在必须创建一个执行程序,启动读取同一文件的第二个线程,等待线程完成读取,而不是等待从主线程读取文件,并且关闭执行器。您的代码仍然是同步的,但使用两个线程而不是一个线程,其中第一个线程阻塞并等待什么都不做,而第二个线程读取文件。
-
@JBNizet - 那我该如何纠正呢?
-
@KevinO - 我想学习如何异步读取文件。
-
您首先要异步读取文件的原因是什么?如果你只是想让主线程在另一个线程读取文件时继续做某事,为什么不简单地让另一个线程读取并打印文件的内容?
标签: java multithreading asynchronous