我一般都是线程新手,所以在这里让我感到很沮丧。
我正在阅读以下有关线程和执行者的页面(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)
将文本文件异步读入列表然后迭代它的正确方法吗?
答案 0 :(得分:1)
问题是主线程立即调用future.get()
,因此阻止执行程序处理文件读取。所以实际上你使用2个线程,但一次只能使用一个(几乎所有时间)。
有关为什么要使用其他线程/并发的一些示例:
记住我上面写的是有助于思考的例子。您需要做的是查看您的需求,然后设计和编写并发代码。在这种特定情况下,不需要并发(由于立即future.get()
调用)。
编辑1(根据您的意见):如果您的目标是了解编写异步任务,那么您的目标将通过您列出的人为实例得到满足。但是,您可以通过考虑我提供给您的示例或者您可以想到自己的一些示例来使其更加真实。