1

如果我编写一个public static void mainjava 程序,除非我放一个while (true)循环,否则程序将运行然后退出,关闭我的小程序窗口。我的问题是当一个网络浏览器运行渲染html内容时,它完成渲染后,为什么它不关闭自己?while (true)Web 浏览器中的隐式在哪里?

4

2 回答 2

3

Java 应用程序结束是因为调用堆栈 结束/在您的方法完成后为空,它们必须跳回到调用它们的位置(这就是方法/函数调用最终在汇编语言中实现的方式)。该方法很特别,因为它是整个 Java 程序的入口点,是从外部调用的入口点。main()main()

在浏览器中,您的应用程序代码在事件循环中运行,而不是作为主浏览器进程的一部分,即通过上述main()方法启动的进程。事件循环,在一个过于简化的程序版本中,看起来像:

public static void main(String args[]) {
  Queue queue = ...;
  while(queue.waitForEvent()){
   queue.processNextEvent();
  }
}

所以,在某种意义上。while(true)是的,您正在谈论的那个隐式声明就在每个浏览器(和其他基于事件循环的系统)实现的深处。浏览器进程不会关闭/终止,直到某些原因导致该事件循环停止运行,例如您关闭运行应用程序的选项卡/窗口。

于 2013-08-18T23:01:15.007 回答
1

一个通过 via 启动的程序main() 可以继续运行,尽管到达了 main 方法的末尾。如果您创建新线程,则可能会发生这种情况,而 GUI 程序偶然会发生这种情况。

AWT(和扩展的摇摆)有一个事件循环处理事件队列。其他工具包或多或少类似地处理它。他们通常有一个进入循环的方法/函数。如果应用程序需要更完整的控制,至少有些还允许控制工具包的事件循环。然后循环可以在应用程序代码中显式。

因此,循环的确切位置取决于浏览器的实现。

于 2013-08-18T22:26:43.860 回答