У меня есть ThreadPoolExecutor:прерывания Runnable, который занимает несколько часов
ThreadPoolExecutor service = new ThreadPoolExecutor(N_THREADS, N_THREADS, 0L, TimeUnit.MILLISECONDS, blockingQueue, rejectedExecutionHandler);
Служба выполняет потоки реализации Runnable интерфейс. Каждый поток обрабатывает файл на диске. Я обнаружил, что через несколько часов два потока (или ядра в зависимости от того, что показывает htop в Linux) работают и работают 13 часов. Хуже всего то, что остальные ядра не показали активности, как будто они ожидали завершения двух потоков.
Вопросы: 1 - Я много читал о том, как эта проблема может быть решена, но ничего окончательного. Насколько я могу это сделать, вы НЕ МОЖЕТЕ остановить Runnable с помощью ThreadPoolExecutor, потому что это независимый поток, который только запускается. Использование будущего рамок:
Future<?> f = f.get(submittedtask,XX)
позволяет установить тайм-аут и принести будущий результат, но получить блоки все нити эффективно делает серийник реализации. Можно ли прерывать Runnable по истечении заданного времени с помощью threadpoolexecutor, вернуть поток в пул, чтобы он мог выполнить новую задачу и продолжить.
2 - Моя большая проблема заключается в том, почему, используя htop, я вижу два потока/ядра, и ни одно другое ядро / нить не работает, несмотря на то, что многие задачи все еще ждут выполнения (т. Е. Осталось много файлов для обработки). Любое понимание?
http://docs.oracle.com/javase/7/docs/api/java/util/concurrent/Future.html#cancel%28boolean%29. Что касается количества занятых ядер: какова ценность N_THREADS? Сколько ядер у вас есть? –
Прикрепите отладчик к запущенной JVM. Для этого вам нужно запустить JVM с правильными параметрами отладки. –
N_Threads 24, поэтому 12 ядер (Intel Xeon E5 что-то) – user1938803