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

wecizke3  于 2023-02-15  发布在  Java
关注(0)|答案(2)|浏览(224)

我创建了我自己的线程类来实现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();
}

当我调试它的时候,最后调用的方法是Thread-类的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-方法所在的位置:

tf7tbtn2

tf7tbtn21#

但是每次我开始运行我自己的线程类作为一个新线程时,主类线程就不再自行终止了。
这是错误的。你的程序不会终止,因为至少有一个非守护线程还在运行。规则是:如果终止了所有非守护进程线程,则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方法内部启动的线程:

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

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

...将产生不同的线程图片:

这里的主线程因为被终止而消失了,但是另一个启动的线程仍然在运行。
旁注:突然出现了另一个线程-DestroyJavaVM。请查看帖子DestroyJavaVM thread ALWAYS running以了解更多信息。

ehxuflar

ehxuflar2#

这个问题确实不是由多线程逻辑本身引起的,而是由Eclipse和相应的JVM引起的。在NetbeansTomcat 8 Server中运行完全相同的代码不会导致任何问题。重新安装Eclipse并不能解决Eclipse框架内的故障。但有把握的问题不会造成任何麻烦的服务器上是足够的,我关闭的情况。
感谢Seelenvirtuose的提示和他的努力。

相关问题