Java主类线程不再在Eclipse中使用Java多线程终止

Java主类线程不再在Eclipse中使用Java多线程终止,java,multithreading,Java,Multithreading,我创建了自己的线程类,实现了Runnable接口。但每次我开始以新线程的形式运行自己的线程类时,主类线程不再自行终止。这只是Eclipse中的一个问题,还是在服务器上运行时也会遇到问题?我是否必须更改调用线程的某些内容,以便主方法可以正确终止 这是我的基本自制线: public class OwnThread implements Runnable { @Override public void run() { //do something } } 以下是不再

我创建了自己的线程类,实现了
Runnable
接口。但每次我开始以新线程的形式运行自己的线程类时,主类线程不再自行终止。这只是Eclipse中的一个问题,还是在服务器上运行时也会遇到问题?我是否必须更改调用线程的某些内容,以便主方法可以正确终止


这是我的基本自制线:

public class OwnThread implements Runnable {
   @Override
   public void run() {
      //do something
   }
} 
以下是不再终止的主类:

public static void main(String[] args) {    
   Thread thread = new Thread(new OwnThread());
   thread.start();
}
当我调试它时,最后调用的方法是
线程
-类的
exit()
-方法。在完成这些代码行之后,该过程将永远继续:

/**
 * This method is called by the system to give a Thread
 * a chance to clean up before it actually exits.
 */
private void exit() {
   if (group != null) {
      group.threadTerminated(this);
      group = null;
   }
   /* Aggressively null out all reference fields: see bug 4006245 */
   target = null;
   /* Speed the release of some of these resources */
   threadLocals = null;
   inheritableThreadLocals = null;
   inheritedAccessControlContext = null;
   blocker = null;
   uncaughtExceptionHandler = null;
}

这是一个永远运行的线程的屏幕截图。
TestInterface
类是
main
-方法所在的位置:

但每次我开始以新线程的形式运行自己的线程类时,主类线程不再自行终止

这有点错误。您的程序不会终止,因为至少存在一个仍在运行的非守护进程线程。规则是:如果所有非守护进程线程都被终止,那么Java程序将被终止

我修改了您的程序以明确此行为:

public class OwnThread implements Runnable {
    @Override
    public void run() {
        runForever();
    }

    public static void main(String[] args) {
        Thread thread = new Thread(new OwnThread());
        thread.start();
        runForever();
    }

    private static void runForever() {
        while (true) {}
    }
}
运行将创建两个将永远运行的线程。一个是通过运行程序启动的主线程,另一个是在main方法内部启动的线程:

通过删除主方法中对runForever的调用来修改上述代码

public static void main(String[] args) {
    Thread thread = new Thread(new OwnThread());
    thread.start();
}
。。。将导致不同的线程图片:

在这里,由于主线程被终止,所以主线程消失了。但另一个启动的线程仍在运行


旁注:突然出现另一个线程-
DestroyJavaVM
。有关更多信息,请查看帖子。

问题确实不是由多线程逻辑本身引起的,而是由Eclipse和相应的JVM引起的。在Netbeans或在tomcat8服务器上运行完全相同的代码不会导致任何问题。Eclipse的重新安装并没有解决Eclipse框架内的故障,但如果确定该问题不会在服务器上造成任何问题,我就可以结束这个案例


感谢您的提示和他的努力。

除了“这不是正确的方法”:您是否尝试在
main
的末尾添加
线程。join()
通常在运行
exit()
方法时,线程被视为“终止”。在那之后你调试过线程的状态了吗?@daniu我用
join()
yield()
试过,没有改变任何东西。那么,正确的方法是什么呢?@DavidStuder在您的示例中,没有线程(主线程和另一个启动线程)正在运行。此程序直接终止。也许你把代码简化得太多了。请看我的例子,了解我的想法。否则请做一个决定。好的。这很奇怪。显然,两个线程都已终止,但应用程序仍在运行。这可能是Eclipse的问题,但也可能是JavaVM的问题。也许重新安装会有帮助。这不是正常行为,与您的Java代码无关。但是,如果另一个线程已被
exit
ed,为什么它仍在运行?@daniu它正在运行,因为它没有终止(或如您所说退出)。OP确实声明他发现“最后调用的方法是thread类的exit()-方法”但在调试时。@daniu很好。。。这是因为一个线程被终止:主线程!我仍然在讲我的例子。我认为,老年退休金计划的问题恰恰相反。主线程仍在运行,但另一个线程终止。这意味着主线程仍在执行某些操作。@DavidStuder-Hmmm。在您的示例中,两个线程都被正确终止。在这种情况下,应用程序(JavaVM)也应该终止。