java程序结束时挂起

时间:2015-11-25 22:17:02

标签: java main

我有一个java程序,它打印出主程序的最后一个语句并挂起。我想知道什么可能导致这个问题,谢谢。

 public static void main(String[] args) {

        ...
        ...
        JSch jsch=new JSch();
    try {

        jsch.addIdentity("xxx");
        session = jsch.getSession("centos", this.ip, 22);
        session.setConfig("StrictHostKeyChecking", "no");
        session.connect();

    } catch (JSchException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }
    ...
    ...
        System.out.println("end of test");
    }

程序打印“测试结束”并挂起。什么可能导致这个问题?我没有使用任何框架。 我在linux机器上编译并运行它。打印完“测试结束”后,linux提示符“>”没有出现

从ps命令,我看到进程正在运行。

我发现了这个问题。会话连接不会被取消。但为什么它会阻止退出? 如果我错了,请纠正我。主线程内没有连接或等待。主线程可以被阻止吗?

答案: 在斯蒂芬C的帮助下, 最后,我找到了原因。在c ++中,所有线程在主线程退出后终止,但在java中,JVM等待所有非守护程序线程完成。我将我的c ++知识应用于Java,但在这种情况下它们是不同的。

2 个答案:

答案 0 :(得分:1)

一种可能性是您创建了另一个线程,该线程尚未终止。在所有(非守护程序)线程终止之前,JVM不会自行关闭。

另一种可能性是你已经实现了一个关闭钩子,钩子已经被阻止。

  

从ps命令,我看到进程正在运行并且是单线程。

我认为,这些证据与上述任何一项都是一致的。

  

我们可以从外部(例如ps命令)而不是源代码进行故障排除。

尝试使用jstack(我认为它被调用)来获取线程堆栈转储。

尝试将调试器附加到JVM。

答案 1 :(得分:0)

您需要明确调用session.disconnect();,如果您使用频道,则需要对频道进行折扣。