java线程在15分钟后不运行

时间:2013-07-29 20:51:08

标签: java multithreading

有谁知道线程为什么不马上开始?也就是说,10分钟,20 ..线程不启动... logger是java Logger的简单装饰器......

这是代码开始:

....
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分钟,系统未加载,我不明白为什么它不起作用? 有人能够向我解释我做错了什么?

1 个答案:

答案 0 :(得分:3)

  

......从发布开始已超过10分钟,系统未加载,我不明白为什么它不起作用?有人能够向我解释我做错了什么?

我怀疑run()方法会引发某种异常 - 可能是NPE。

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

connection nullgetUser()是否有机会在此处返回null?我敢打赌,如果你只是记录一个简单的"made it here"方法,你会在日志中看到它。您应该将run()行括在try {} catch (Exception e) { log exception }块中并记录异常。我还尝试使用调试器并在第一个日志行中放置一个断点并逐步执行它以查看发生了什么。见debugging tutorial for eclipse

您还可以在线程上设置UncaughtExceptionHandler以便以此方式记录。请参阅:Using UncaughtExceptionHandler effectively

另一种可能性是您的MyLoggerrun()日志条目记录到另一个文件中,但看起来主线程日志消息使用相同的记录器,因此不太可能。如果可以,那么在System.out.println("in run()");开头使用run()将有助于排除这种情况。