Как видно из названия, у меня есть код, завернутый в бесконечный цикл while(true)
, и все они полностью пойманы try
и catch
. Однако этот поток запускается в основном методе, однако после длительного запуска этот рабочий поток исчезает таинственным образом, когда я проверяю использование jstack и заставляя работу накапливаться.Кто убил My Java Infinite loop thread?
Ниже мой код:
public void run() {
while (true) {
try {
// Consumer consumes from Kafka server
Global.KAFKA_METRIC_DATA_CONSUMER.consume(topic, handler);
} catch (Exception e) {
logger.error("Kafka consumer process was interrupted by exception!");
} finally {
try {
// Prevent restart too often
Thread.sleep(30 * BaseConst.SECOND);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
Для моего понимания, эта структура будет держать нить работает так потребитель. Даже если методы потребления() не удались, он перезапустится бесконечно. Однако, как я уже упоминал выше, вся нить исчезает без какого-либо журнала ошибок. Может ли кто-нибудь дать подсказку, пожалуйста?
Некоторые больше информации, которые могут быть полезны:
- Я проверил метод потреблять никогда не выключит потребитель ни закрыть сокет к серверу. Он будет постоянно пытаться подключиться к серверу после сбоя .
- Я проанализировал свалку кучи java, и я обнаружил, что есть утечка памяти где-то еще в проекте, что очень часто вызывает оккупацию памяти high и gc. Тем не менее, основным методом остается бег.
Вы не должны использовать 'Thread' напрямую; вместо этого используйте «ExecutorService» (возможно, даже «ScheduledExecutorService» в вашем случае). Кроме того, ловить «Исключение» - это плохая идея в целом - вы даже поймаете все «RuntimeException». Но ... Вы не поймаете 'Ошибка'. Что, вероятно, происходит здесь, так это то, что вы активировали, скажем, «OutOfMemoryError», которые запустили цикл до конца. В более общем плане вы должны рассмотреть свой дизайн. – fge
Кроме того, вместо '' Thread.sleep() 'вы можете использовать' TimeUnit.SECONDS.sleep (30L) '; но в любом случае использовать «ScheduledExecutorService». – fge