【问题标题】:Why Java infinite loop is possible? And what recommendations for this为什么Java无限循环是可能的?以及对此有何建议
【发布时间】:2016-07-17 17:07:20
【问题描述】:

我是 Java 新手,但对 JavaScript 不是。

所以,在 JS 中你不能使用这样的代码

while(true){/* do something */}

因为这样浏览器标签会永远卡住。实际上在无限循环被调用后,关闭这个选项卡会很困难。

但在Java中,正如我所见,使用这样的代码是正常的

try {
    while (true) {
        try {
            socket.println(data);
        } finally {
            socket.close();
        }
    }
} catch (IOException exception){
    log(exception);
}

第一季度。那么,我想知道无限循环在 Java 中是如何工作的?

第二季度。如果我想在几个小时内监听套接字的数据,我的线程是否会卡在 JavaScript 的浏览器选项卡中?

第三季度。 (如果 Q2 == false)为什么 Java 无限循环不会像我们在 JavaScript 中看到的那样消耗 Thread 的所有可用资源?

第四季度。这种代码变体是否更适合套接字读取,因为我在“睡觉”时会错过一些重要数据?

while(true){
    readSocket();
    Thread.sleep(10);
}

【问题讨论】:

  • Socket不能这样工作,你需要先接受socket连接
  • Socket clientSocket = serverSocket.accept();在while循环中,确保while循环在thread或doInBackground中
  • 如果我的套接字实际上是客户端而不是服务器怎么办?

标签: javascript java multithreading sockets infinite-loop


【解决方案1】:

Q1 - 无限循环将重复代码直到以某种方式中断。在这种情况下,它实际上不是无限的——它使用了一种技巧。抛出异常时存在循环。

Q2 - 线程确实卡在了循环中。但在 Java(和许多其他语言)中,您可以创建另一个线程来运行您的 UI 或同时运行您需要运行的任何东西。

Q3 - 不,它完全使用线程。

Q4 - 睡觉对你没有帮助。当线程处于休眠状态时,它什么也不做,所以它仍然“卡住”。

【讨论】:

    【解决方案2】:

    Q1)首先要了解为什么这段代码不是无限循环,看看java中的异常是如何工作的。每当 try 块中发生异常时,它立即移动到 catch 语句。因此,套接字最终将关闭,然后再次访问套接字时将引发异常。将退出 while 循环并运行错误处理程序块。所以这不是一个无限循环。

    Java 中的无限循环与任何其他编程语言一样工作 - 如果您没有退出条件,代码将根本不会退出。

    Q2) 如果您想长时间监听数据,有许多预构建的类可以为您处理这些内容。查看Java ServerSocket 和一些相关/派生类。

    Q3) 不知道如何回答,见上文。

    Q4) 再次,参见答案 #2。通过使用内置的服务器方法可以解决很多这些问题。如果您不想使用内置函数,它们可以作为构建您自己的类的一个很好的参考。

    祝你好运!

    【讨论】:

      【解决方案3】:

      AFAIK 浏览器对两者都使用一个线程:

      • UI 渲染

      • JS 执行

      所以它解释了为什么在 JS 执行中存在无限循环时浏览器卡住(我猜你的意思是 UI 卡住)。详情请查看post

      对于Java,大部分UI程序都是多线程的,

      • GUI 程序。 UI的更新是在另一个线程中,所以当另一个线程卡住时,GUI不会卡住。
      • Web 服务器。大多数 Java 网络服务器在处理传入请求时会生成一个新线程(或使用线程池),因此接受循环不会卡住。

      您可能还想查看底层浏览器执行模型:Event Loop

      【讨论】:

        猜你喜欢
        • 2021-02-28
        • 2012-11-12
        • 1970-01-01
        • 2020-02-20
        • 1970-01-01
        • 2014-01-17
        • 2012-11-06
        • 1970-01-01
        相关资源
        最近更新 更多