Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Java [игнор отключен] [закрыт для гостей] / Самопроизвольное завершение потоков / 5 сообщений из 5, страница 1 из 1
17.10.2014, 14:05
    #38779991
publexus
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Самопроизвольное завершение потоков
Запускаю потоки через Executors.newCachedThreadPool(). Потоки могут порождать дочерние, но не более 2-го уровня. Некоторые из потоков запускаются, но потом бесследно куда-то исчезают. Вот пример кода внутри потока:

Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
class Task implements Runnable {

	@Override
	public void run() throws Exception {

		try {
			log("started");

			// основные действия, без ретурнов
			// здесь также могут запускаться дочерние потоки (но не более 2 уровня)
			...

			log("end");
			return;

		} catch(Exception e) {
			log("runtime exception: " + e.getMessage());

		} finally {
			log("finally");
		}
	}
}



Все процессы запускаются (фиксируют log("started")), но небольшой процент потоков почему то не доходит до log("end"), при этом в секцию catch не попадает, но выполняет секцию finally. В выводе консоли никаких эксепшенов нет. Никаких выходов из основного блока нет. Из кода процессы принудительно не прерываются.

Может ли ExecutorService самостоятельно прерывать порожденные процессы? Но разве при этом не должен выполниться catch с InterruptedException?

Почему такое может происходить?
...
Рейтинг: 0 / 0
17.10.2014, 14:13
    #38780004
Blazkowicz
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Самопроизвольное завершение потоков
publexus,

У вас вылетает Throwable или Error, который не ловится в catch(Exception e).
Гребаный ThreadPoolExecutor непойманые исключения спокойно игнорирует и даже никуда не выводит.
Поменяейте на catch(Throwable e) и увидите какая у вас ошибка.
...
Рейтинг: 0 / 0
17.10.2014, 14:56
    #38780086
publexus
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Самопроизвольное завершение потоков
Blazkowicz,

Сделал как вы сказали. Запустил несколько раз тесткейс. Во всех случаях все задачи отработали до конца (хотя до этого в большинстве тесткейсов терялись потоки). Но при этом никаких эксепшенов в логах не было. Чудеса!
...
Рейтинг: 0 / 0
17.10.2014, 15:23
    #38780127
publexus
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Самопроизвольное завершение потоков
Blazkowicz,

Однако при запуске более тяжелого тесткейса, выскочило java.lang.OutOfMemoryError: unable to create new native thread. Но сейчас я отлавливаю эту ошибку.
Теперь понятно, что система не могла запустить поток из-за нехватки ресурсов и тупо прерывала текущий.

Спасибо Blazkowicz за помощь.
...
Рейтинг: 0 / 0
17.10.2014, 16:03
    #38780226
cdtyjv
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Самопроизвольное завершение потоков
publexusОднако при запуске более тяжелого тесткейса, выскочило java.lang.OutOfMemoryError: unable to create new native thread. Но сейчас я отлавливаю эту ошибку.
Теперь понятно, что система не могла запустить поток из-за нехватки ресурсов и тупо прерывала текущий.Текущие потоки никто не прерывал. Они сами себя прерывали, если им требовалось что-то заалоцировать, но не получалось из-за нехватки памяти. в общем случае, OOME в одном потоке никак не влияет на другие потоки.
...
Рейтинг: 0 / 0
Форумы / Java [игнор отключен] [закрыт для гостей] / Самопроизвольное завершение потоков / 5 сообщений из 5, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]