2013-07-29 3 views
0

Кто-нибудь знает, почему нить не начинается сразу? то есть, 10 мин, 20 .. Тема не начинай ... регистратор просто декоратор для Java Logger ...java Thread не работает после 15 минут

вот код начала:

.... 
log.info("client streams prepared"); 
messagelistener = new Thread(new Listener(input, this)); 
messagelistener.start(); 
log.info("Connection prepared"); 
.... 

и начал слушатель

public class Listener implements Runnable { 

    private final MyLogger logger = MyLogger.getLogger(); 
    private final ObjectInputStream input; 
    private final Connection connection; 

    public Listener(ObjectInputStream input, Connection callback) { 
     connection = callback; 
     this.input = input; 
     logger.info("Listener created"); 
    } 

    @Override 
    public void run() { 
     logger.info("listener thread in connection with "+ connection.getUser().getDisplayName() + " is started"); 
     //.....samecode 
     logger.info("listener thread in connection with " 
       + connection.getUser().getDisplayName() + " is stopped"); 
    } 
} 

журналы:

2013-07-29 22:36:58 MyLogger info INFO: client streams prepared 
2013-07-29 22:36:58 MyLogger info INFO: Listener created 
2013-07-29 22:36:58 MyLogger info INFO: Connection prepared 

в печати увидеть информацию до начала и после старта, но не го первая строка метода запускается, и прошло более 10 минут с момента запуска, система не загружена, я не понимаю, почему она не работает? Кто-то может объяснить мне, что я делаю неправильно?

+0

замените logger.info на System.out.println, чтобы проверить его. – SSpoke

+0

Можете ли вы показать нам весь метод, включая объявление, в котором создается слушатель. Также мы можем увидеть объявление для 'Connection # getUser() '? Возможно ли, что у вас есть тупик? Может быть, 'getUser()' является 'synchronized', а также метод создания? – msandiford

ответ

3

... и прошло более 10 минут с момента запуска, система не загружена, я не понимаю, почему она не работает? кто-то может объяснить мне, что я делаю неправильно?

Я подозреваю, что метод run() бросает какое-то исключение - возможно, NPE.

logger.info("listener thread in connection with "+ 
     connection.getUser().getDisplayName() + " is started"); 

Любой шанс, что connection является null или getUser() возвращает нулевое значение здесь? Готов поспорить, что если вы просто запишите простой метод "made it here", вы увидите это в журналах. Вероятно, вы должны заключить строки run() в блок try {} catch (Exception e) { log exception } и регистрировать исключение. Я также попытаюсь использовать отладчик и поставить точку останова в первой строке журнала и пропустить ее, чтобы посмотреть, что происходит. См. Это debugging tutorial for eclipse.

Вы также можете установить UncaughtExceptionHandler в свою ветру, чтобы зарегистрироваться в этом вопросе. См: Using UncaughtExceptionHandler effectively

Другая возможность заключается в том, что ваш MyLogger регистрирует в run() записи журнала в другой файл, но это выглядит как сообщения журнала главной нити используют один и тот же регистратор так менее вероятно. Если это возможно, то использование System.out.println("in run()"); в начале run() поможет исключить это.

+0

кажется, что мухи не захватили NullPointer .. – Morgaroth

+0

Какие файлы @ user1841779? Внутри метода 'run()' не существует неявного try/catch. И не подразумевается регистрация исключений. Тебе придется это сделать самому. – Gray

+0

Я нашел ошибку сейчас, так как вы предложили getUser может вернуть null, и это не удалось войти в журнал, в будущем я буду использовать потоки с установленным UncaughtExceptionHandler ... – Morgaroth

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