Постоянные переменные в ExecutorService (Java)

Я создал пул из 4 рабочих потоков для обработки некоторых файлов. В тесте их около 200 штук.Версия с пулом потоков уже примерно в 3 раза быстрее, чем при последовательной, но есть возможности для улучшения.

Самым большим узким местом (игнорированием дискового ввода-вывода) является то, что мне нужно создать экземпляр нового объекта MessageDigest. В однопоточной версии у меня было только 1. В этой версии у меня 200.

Меня интересовало, возможно ли иметь переменную, локальную для потока в рабочем пуле? Таким образом (при условии, что ни один поток не умирает) будет только четыре экземпляра объекта MessageDigest, а не 200 ...

Каждая задача требует дайджеста, поэтому я не уверен, есть ли лучший способ сделать это ...

ОБНОВЛЕНИЕ

Я пытался использовать объект ThreadLocal, но где мне его создать? Если я создам его в самой задаче, я предполагаю, что она выйдет из контекста, когда задача будет выполнена. Каждый раз создается новый экземпляр. У меня есть такой код:

    ThreadLocal<GenerateSHA1> tl = new ThreadLocal<GenerateSHA1>();

    hashMaker = tl.get();
    if(hashMaker == null){
        hashMaker = new GenerateSHA1();
        tl.set(hashMaker);
    }

Это делается внутри конструктора задачи.

ОБНОВЛЕНИЕ

Хорошо, что статический вид работает в том смысле, что объект не теряется, но теперь это указывает на другую проблему. Рабочие «задачи» создаются в основном потоке, а затем добавляются в ExecutorService с помощью invokeAll ().

Есть идеи, как это обойти?

5
задан Hearen 11 May 2019 в 06:55
поделиться