【发布时间】:2021-05-11 20:28:02
【问题描述】:
您好,我对 Java 有点陌生。
我有一个方法,它接收一个映射,并将映射中的每个键值对写入一个文件。
我希望映射中的每个键值对都有一个线程运行,以便我可以同时创建多个文件。不确定执行此操作的正确方法是什么或如何使用执行器服务来完成此操作。
这是我正在尝试的一个非常简单的示例。而不是编写用于编写文件的所有代码,我只是在示例中使用 system.out.println:
public class CityWriter
{
public static void main(String []args)
{
LinkedHashMap<Integer, ArrayList<City>> stateNumCitiesMap = new LinkedHashMap<Integer, ArrayList<City>>();
stateNumCitiesMap = retrieveStateCitiesMap();
int numOfThreadsToExecuteAtATime = 10;
ExecutorService executor = Executors.newFixedThreadPool(numOfThreadsToExecuteAtATime);
for(Integer key : stateNumCitiesMap.keySet()) //Could have up to 50 key,values in map
{
executor.execute(writeCitiesOfStateToFile(key, StateNumCitiesMap.get(key)));
}
executor.shutdown();
}
public LinkedHashMap<Integer, ArrayList<Cities>> writeCitiesOfStateToFile(int stateNum, List<City> citiesList)
{
for(City city : citiesList)
{
System.out.println(stateNum +" "+ city);
}
}
}//end of class
我的问题是它似乎没有在这里并行执行线程。此外,我不想一次运行超过 10 个线程,即使 for 循环会调用 executor 50 次。
请告诉我什么是最有效的方法。
【问题讨论】:
-
你要写的文件真的很大吗?因为如果它们是小文件,多线程可能没用。如果它们很大,您可以尝试使用两个或三个线程并写入文件。当一个文件被写入后,您将使用另一个可用线程转到下一个文件。如果你想要一个关于多线程的总结,看看Tutorialpoint
-
这可以编译吗?静态方法中没有
this,writeCitiesOfStateToFile不是execute ()的有效参数。 -
是的,文件非常大,写入文件之前方法中的实际代码需要一段时间才能完成。
-
抱歉没有检查是否编译我当场做了一个简单的例子
-
嗨@daniu。我希望能够多线程这个方法它必须是 Runnable 并返回 runnable 还是有其他方法?
标签: java multithreading concurrency executorservice