- mongodb - 在 MongoDB mapreduce 中,如何展平值对象?
- javascript - 对象传播与 Object.assign
- html - 输入类型 ="submit"Vs 按钮标签它们可以互换吗?
- sql - 使用 MongoDB 而不是 MS SQL Server 的优缺点
我有一个 .csv 文件,其中包含超过 7000 万行,其中每一行用于生成 Runnable,然后由线程池执行。这个 Runnable 会在 Mysql 中插入一条记录。
更重要的是,我想记录一个 csv 文件的位置,以便 RandomAccessFile 定位。该位置被写入一个文件。我想在线程池中的所有线程都完成后写入此记录。因此调用了ThreadPoolExecutor.shutdown()。但是当更多行出现时,我又需要一个线程池。我怎样才能重用这个当前的线程池而不是创建一个新的。
代码如下:
public static boolean processPage() throws Exception {
long pos = getPosition();
long start = System.currentTimeMillis();
raf.seek(pos);
if(pos==0)
raf.readLine();
for (int i = 0; i < PAGESIZE; i++) {
String lineStr = raf.readLine();
if (lineStr == null)
return false;
String[] line = lineStr.split(",");
final ExperienceLogDO log = CsvExperienceLog.generateLog(line);
//System.out.println("userId: "+log.getUserId()%512);
pool.execute(new Runnable(){
public void run(){
try {
experienceService.insertExperienceLog(log);
} catch (BaseException e) {
e.printStackTrace();
}
}
});
long end = System.currentTimeMillis();
}
BufferedWriter resultWriter = new BufferedWriter(
new OutputStreamWriter(new FileOutputStream(new File(
RESULT_FILENAME), true)));
resultWriter.write("\n");
resultWriter.write(String.valueOf(raf.getFilePointer()));
resultWriter.close();
long time = System.currentTimeMillis()-start;
System.out.println(time);
return true;
}
谢谢!
最佳答案
如 documentation 中所述,您不能重用已关闭的 ExecutorService
。我建议不要使用任何解决方法,因为 (a) 它们可能无法在所有情况下都按预期工作; (b) 你可以使用标准类实现你想要的。
你必须要么
实例化一个新的ExecutorService
;或
不终止ExecutorService
。
第一种方案很容易实现,我就不细说了。
第二个,因为你想在所有提交的任务完成后执行一个 Action ,你可以看看ExecutorCompletionService
并改用它。它包装了一个 ExecutorService
来进行线程管理,但是可运行对象将被包装成一些东西,当它们完成时会告诉 ExecutorCompletionService
,所以它可以向你报告:
ExecutorService executor = ...;
ExecutorCompletionService ecs = new ExecutorCompletionService(executor);
for (int i = 0; i < totalTasks; i++) {
... ecs.submit(...); ...
}
for (int i = 0; i < totalTasks; i++) {
ecs.take();
}
ExecutorCompletionService
类上的方法take()
将阻塞,直到任务完成(正常或突然)。它将返回一个 Future
,因此您可以根据需要检查结果。
我希望这可以帮助你,因为我没有完全理解你的问题。
关于java - 关闭后如何重用线程池,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7722546/
我是一名优秀的程序员,十分优秀!