0

Как можно повторно использовать пул потоков после его завершения?

11

Описание проблемы

Я работаю с файлом .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;
}

Спасибо!

0 ответ(ов)

Чтобы ответить на вопрос, пожалуйста, войдите или зарегистрируйтесь