我是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);
}
答案 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程序都是多线程的,
此外,您可能需要查看底层浏览器执行模型:Event Loop