为什么Java无限循环是可能的?对此有什么建议

时间:2016-07-17 17:07:21

标签: javascript java multithreading sockets infinite-loop

我是Java新手,但不是JavaScript。

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

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

因为这种方式浏览器标签会永远陷入困境。实际上,在调用无限循环后很难关闭此选项卡。

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

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

Q1。那么,我想知道Java中无限循环是如何工作的?

Q2。如果我想在数小时内监听套接字数据,我的线程是否会被JavaScript作为浏览器选项卡卡住?

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

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

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

3 个答案:

答案 0 :(得分:2)

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

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

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

第四季 - 睡觉不会帮助你。当线程处于休眠状态时,它就不会做任何事情,因此它仍然会被卡住。

答案 1 :(得分:1)

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

java中的无限循环像任何其他编程语言一样工作 - 如果你没有退出条件,代码就不会退出。

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

问题3)不确定如何回答这个问题,见上文。

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

祝你好运!

答案 2 :(得分:1)

AFAIK the brower使用单个线程:

  • UI呈现

  • JS执行

因此,当JS执行中存在无限循环时,它解释了为什么浏览器卡住(我猜你的意思是UI卡住了)。有关详细信息,请查看此post

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

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

此外,您可能需要查看底层浏览器执行模型:Event Loop