我有一个简单的java程序。创建主线程(main()
)并启动另一个线程t
。
class T extends Thread{
@Override
public void run() {
while (true){
System.out.println("Inside thread");
}
}
}
public class Main {
public static void main(String[] args) {
Thread t = new T();
t.start();
//t.join();
System.out.println("end");
}
}
输出:
end
Inside thread
Inside thread
Inside thread
....
....
它无限打印内线。我不是在使用join()等主线程中的子线程。打印结束后,主线程不应退出吗?
更新
当Java虚拟机启动时,通常只有一个 非守护程序线程(通常调用名为main的方法) 指定班级)。 Java虚拟机继续执行 线程,直到发生以下任一情况:
- 已调用类Runtime的exit方法,安全管理器已允许退出操作。
- 所有非守护程序线程的线程都已死亡,无论是通过调用run方法返回还是抛出异常 传播超出run方法。
我找到了原因。第二点澄清了它。我假设所有子线程将在主线程退出后终止(我错了)并且JVM应该关闭。
答案 0 :(得分:4)
主线程已退出。这是另一个仍然活着的线程。
答案 1 :(得分:0)
您创建的主题与main
方法不同步。因此,调用t.start()
后会发生两个进程。一旦main
结束,主要过程就完成了,但是线程t仍在继续。
为了更好地可视化,请在线程的情况下使用布尔变量而不是true
来使线程只打印5次。
class T extends Thread{
int count;
@Override
public void run() {
while (count < 5){
System.out.println("Inside thread");
count++;
}
}
}
请注意,如果无法终止线程,则线程不会自行停止。结束的主要方法不会终止线程。
答案 2 :(得分:0)
注释方法t.join()
正是线程等待调用者线程结束所需的内容。有关更多详细信息,请参阅Thread javadoc
答案 3 :(得分:0)
以下代码将永远运行。请修复你的while循环控制逻辑
while (true) {
System.out.println("Inside thread");
}