【发布时间】:2018-12-05 22:28:06
【问题描述】:
我创建了自己的线程类来实现Runnable 接口。但是每次我开始将自己的线程类作为新线程运行时,主类线程不再自行终止。这只是 Eclipse 中的一个问题,还是我在服务器上运行它也会有问题?我是否必须更改调用线程的内容才能使 main 方法正确终止?
这是我的基本自制线程:
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-class 的exit()-method。看完这几行代码后,这个过程就永远继续下去了:
/**
* 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 方法所在的位置:
【问题讨论】:
-
除了“这不是正确的做法”:您是否尝试在
main末尾添加thread.join()? -
通常在运行
exit()方法时,线程被视为“终止”。在那之后你调试过线程的状态吗? -
@daniu 我用
join()和yield()尝试过,没有改变任何东西。但是,那么正确的方法是什么? -
@DavidStuder 在您的示例中,没有线程(主线程和其他启动的线程)正在运行。该程序直接终止。也许你过于简化了你的代码。看看我的例子以获得一个想法。否则请发送minimal reproducible example。
-
好的。这很奇怪。显然两个线程都已终止,但应用程序仍在运行。这可能是 Eclipse 的问题,但也可能是 Java VM 的问题。也许重新安装会有所帮助。 这不是正常行为,与您的 Java 代码无关。
标签: java multithreading