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