Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/381.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 常规退出和eclipse终止之间有什么区别?_Java_Eclipse_Multithreading - Fatal编程技术网

Java 常规退出和eclipse终止之间有什么区别?

Java 常规退出和eclipse终止之间有什么区别?,java,eclipse,multithreading,Java,Eclipse,Multithreading,当我按ALT+F4(Win)或CMD+Q(Mac)退出程序时,程序将挂起,直到我使用任务管理器强制退出为止 但是,当我使用eclipse的terminate按钮终止程序时,程序会很好地关闭而不会挂起 关闭应用程序的两种方法有什么区别? 例如,这是因为当我们执行常规退出(即ALT+F4)时,应用程序中的线程不会自行终止,而在eclipse中,线程“被迫”终止吗 编辑 我刚刚意识到系统。退出(0)相当于“强制退出”(即没有挂起)。是否有任何方法可以检测按下ALT+F4或CMD+Q时系统/程序将执行s

当我按ALT+F4(Win)或CMD+Q(Mac)退出程序时,程序将挂起,直到我使用任务管理器强制退出为止

但是,当我使用eclipse的terminate按钮终止程序时,程序会很好地关闭而不会挂起

关闭应用程序的两种方法有什么区别?

例如,这是因为当我们执行常规退出(即ALT+F4)时,应用程序中的线程不会自行终止,而在eclipse中,线程“被迫”终止吗

编辑 我刚刚意识到
系统。退出(0)
相当于“强制退出”(即没有挂起)。是否有任何方法可以检测按下ALT+F4或CMD+Q时系统/程序将执行
system.exit

编辑2 我已经做了以下工作,但悬而未决的问题仍然存在:

  • 我已尝试将所有线程更改为守护进程

  • 我使用jvisualvm查看在按下
    ALT+F4
    后哪些线程仍在运行。我确实意识到一些“Pool-I-Thread-I”线程仍在运行。(有没有办法确定代码的哪一部分代表“Pool-i Thread-i”?我怀疑这些线程是由我使用过的第三方库之一创建的。)

  • 在我的threads/callables中,我在线程的最末端有一个控制台输出,当我
    ALT+F4
    程序运行时,控制台输出将显示出来。比如说,

  • 当我按下
    ALT+F4
    时,控制台将打印“线程已完成”,因此我假设这些线程已正确终止


    Eclipse terminate按钮基本上执行Task Manager中force quit的功能——它强制终止进程。Alt+F4或CMD+Q通知程序终止,程序应及时响应;如果没有,您将在Windows中收到无响应程序警报。

    如何确定无响应的原因?(如果你打算推荐
    jvisualvm
    ,你能详细说明“如何”吗?)你能发布你正在运行的应用程序的代码吗?您提到了线程,所以需要检查的一件事是检查您创建的任何线程是否被终止;如果它们应该是守护进程线程(当JVM终止时应该终止的线程),请确保这样做(通过调用thread.setDaemon(true);实际上,在Eclipse中更简单;在Debug中运行应用程序,您应该能够看到线程在运行。当应用程序应该终止时,不应该有非守护线程在运行。很抱歉,我不能在这里发布任何代码,因为这确实是一个非常大的块。我编辑了我的帖子,以显示我在e感谢您的回复。我将尝试eclipse调试方法,因为它看起来像是正在使用线程池,并且没有正确地处理;当您查看线程池(pool-I thread-I)中线程的stacktrace时,您可能会发现其中运行的是什么,并确保已正确地处理。
    public Void call() {
        while(true) {
            
        }
        System.out.println("Thread has finished");
    }