2013-12-17 2 views
0

Я использую службу Java Executor для создания singlethread. Код: -64 бит Centos Java JVM не может создать собственный поток

ExecutorService executor = Executors.newSingleThreadExecutor(); 
try { 
    executor.submit(new Runnable() { 

     @Override 
     public void run() { 
      Iterator<FileObject> itr = mysortedList.iterator(); 
      while (itr.hasNext()) { 
       myWebFunction(itr.next(); 
      } 
     }; 
    }).get(Timeout * mysortedList.size() - 10, TimeUnit.SECONDS); 
} catch (Exception ex) { 

} finally { 
    executor.shutdownNow(); 
} 

Деталь: myWebfunction обрабатывает файлы разного размера и content.Processing предусматривает извлечение всего содержимого и применение дальнейших действий по содержимому файла. Программа работает в 64bit Centos.

Задача: Когда myWebfunction получает файл размером более определенного порога, скажем 10 МБ, служба-исполнитель не может создать собственный поток. Я пробовал различные настройки -Xmx и -Xms, но все же служба-исполнитель выдает ту же ошибку.

ответ

0

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

Предлагаю использовать другой подход, который не использует так много потоков или убивает их, когда вы знаете, что они вам больше не нужны. Например. попробуйте проверить цикл прерывания и вызовите функцию Future.cancel (true), чтобы прервать его.

+1

Ловля прерванного исключения, созданного функцией Future.cancel (true), помогло избежать блокировки потоков. Я думаю, что функция executor.shutdownNow не выбрасывает исключение Interrupted. – RocketScience

Смежные вопросы