Я создал пул из 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 ().
Есть идеи, как это обойти?