Исключение при потере потока - PullRequest
0 голосов
/ 19 ноября 2009

Я запускаю два потока с помощью Timer и TimerTasks

Timer timer = new Timer();
            TimerTask task = new TimerTask() {
                public void run() {
                    doSomething();
                }
            };
            Calendar start = Calendar.getInstance();
            timer.scheduleAtFixedRate(task, start.getTime(),
                    1000 * 60 * 60);

Теперь иногда второй поток останавливается. Есть ли возможность наблюдать поток, возможно, для отправки почты, когда этот поток останавливается, возможно, третьим потоком, который ищет второй поток?

Ответы [ 2 ]

2 голосов
/ 19 ноября 2009

Вам нужно сохранить ссылку на ваш Timer в активном состоянии - если Timer будет собирать мусор, поток будет остановлен. От документы :

После последней живой ссылки на Таймер объекта уходит и все нерешенные задачи выполнены выполнение, выполнение задачи таймера поток завершается изящно (и становится предметом мусора коллекция). Тем не менее, это может занять произвольно долго происходить. По умолчанию, поток выполнения задачи не запускается как нить демона, так он способен держать заявку от терминатор. Если звонящий хочет прекратить выполнение задачи таймера резьба быстро, вызывающий должен вызвать метод отмены таймера.

Что может не быть проблемой, но это наиболее вероятная причина. Я полагаю, если вы можете сохранить поток, вам ничего не нужно проверять?

0 голосов
/ 19 ноября 2009

Я бы предложил добавить Thread # setDefaultUncaughtExceptionHandler в вашу программу. У вас может быть этот журнал / электронная почта / и т. Д. Несмотря на то, что catch (Throwable) - лучший дизайн, необработанный обработчик исключений может обрабатывать любые пропущенные вами случаи.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...