В моем веб-приложении, работающем с tomcat 6, планируется запуск объекта (а не сервлета) для чтения файлов из определенной папки. После чтения файла содержимое файла сохраняется в базе данных.Высокая производительность при многозадачности внутри Tomcat
Для обеспечения более высокой производительности требуется многозадачность. Мой первоначальный подход заключается в создании нового потока после чтения файла, задачи каждого файла выполняются параллельно в фоновом режиме. Например, если три файла найдены, создаются три потока.
Однако, хотя конфигурация tomcat установила maxthreads более чем на 200, а также 32 ГБ памяти, была назначена каждый раз, когда одновременно запускается только 7-8 потоков. Что не так? Или многопоточность не является лучшей практикой для многозадачности? Пожалуйста помоги.
Дополнение (14 марта 2014 года) Спасибо за ваш совет. Поэтому мой вопрос может быть более конкретным: 1. Может ли ThreadPoolExecutor улучшить производительность? 2. Может ли NIO улучшить производительность?
Вот исходный код:
String[] listFiles = folder.list();
for(int i=0; i<listFiles.length; i++) {
synchronized(globalHashMap) {
MyTask myTask = new MyTask(listFiles[i]);
globalHashMap.put(listFiles[i], myTask);
myTask.start();
}
}
MyTask {
String myFile;
Thread myThread;
public MyTask(String file) {
myFile = file;
}
public void start() {
myThread = new Thread(new Runnable() {
do {
readCnt = bufferedInputStream.read(bytesArray, 1024, 1);
...
} while(not end);
postProcessFunction();
synchronized(globalHashMap) {
globalHashMap.remove(myFile);
globalHashMap.notifyAll();
}
}
myThread.start();
}
}
Многопоточность может помочь вам, если вы используете его правильно. Я бы рекомендовал использовать «ExecutorService» вместо ручного создания ваших потоков. Также учтите, что вы не должны запускать столько потоков. –
Если ваши файлы находятся в одной папке, дисковый ввод-вывод, скорее всего, станет узким местом, я сомневаюсь, что больше потоков, попавших на один и тот же жесткий диск, ускорит работу. – wallenborn
Спасибо за ваш совет. Поэтому мой вопрос может быть более конкретным: 1. Может ли ThreadPoolExecutor повысить производительность? 2. Может ли NIO повысить производительность? –