我创建了我自己的线程类来实现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
-方法所在的位置:
2条答案
按热度按时间tf7tbtn21#
但是每次我开始运行我自己的线程类作为一个新线程时,主类线程就不再自行终止了。
这是错误的。你的程序不会终止,因为至少有一个非守护线程还在运行。规则是:如果终止了所有非守护进程线程,则Java程序也将终止。
我修改了您的程序以明确此行为:
运行它将创建两个永远运行的线程,一个是通过运行程序启动的主线程,另一个是在main方法内部启动的线程:
通过删除main方法中对 runForever 的调用来修改上述代码...
...将产生不同的线程图片:
这里的主线程因为被终止而消失了,但是另一个启动的线程仍然在运行。
旁注:突然出现了另一个线程-
DestroyJavaVM
。请查看帖子DestroyJavaVM thread ALWAYS running以了解更多信息。ehxuflar2#
这个问题确实不是由多线程逻辑本身引起的,而是由Eclipse和相应的JVM引起的。在Netbeans或Tomcat 8 Server中运行完全相同的代码不会导致任何问题。重新安装Eclipse并不能解决Eclipse框架内的故障。但有把握的问题不会造成任何麻烦的服务器上是足够的,我关闭的情况。
感谢Seelenvirtuose的提示和他的努力。