Как можно повторно использовать пул потоков после его завершения?
Описание проблемы
Я работаю с файлом .csv, который содержит более 70 миллионов строк. Каждая строка должна генерировать объект 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;
}
Спасибо!
Почему нет ConcurrentHashSet, если есть ConcurrentHashMap?
Когда следует использовать поток Java вместо Executor?
Распределённый контроль параллелизма
В чем разница между использованием synchronized на lockObject и использованием this как блокировки?
Как объявить массив в одну строку?