我一直在思考为什么JDBC只是阻塞操作,为什么我不能为假设的事件处理程序onResultSetArrived(ResultSet rs)设置一些侦听器。为什么我必须为每个JDBC查询阻塞一个线程。
过了一段时间,我深入研究了Java套接字(我想JDBC是构建在它们之上的),并意识到也没有任何事件处理。提供非阻塞读取的唯一选项是通过available()方法,但这非常低效,因为必须在循环中定期检查它。
据我所知,中断是PC中最基本的东西。它从硬件一直到操作系统。在Java中,它可以实现为从套接字读取值的事件驱动方法。
现在,我的问题是,我是否遗漏了一些东西,是否存在一些变通方法,或者Java中当前的架构真的是一个线程一个阻塞操作?如果是,效率不是很低吗?
在Java中,可以有很多线程。线程一直在html" target="_blank">执行它的工作,直到它在某个地方被阻塞(通常是在互斥体或I/O操作上)。当然,这不会阻塞其他线程。
多线程应用程序的基本情况是,在等待阻塞的线程时使用多个线程会引入太多的等待。这里“太多”的定义完全取决于您,但总的来说,这是您如何通过更好地利用资源来实现更好的性能。
然而,Java线程的工作方式有一些限制。大多数(如果不是全部)都是当线程在Java的“外部”某个地方被阻塞时,比如在OS调用或外部(本机)库中。理论上,如果本机代码阻塞了线程,Java对此无能为力。通常,这不应该是一个问题,除非本机代码有bug。
因此,在阻塞JDBC响应的情况下,您将创建一个新线程,该线程将在第一个线程等待数据库完成时执行其他工作。或者,您可以创建一个线程,只用于执行JDBC。除了OS施加的限制之外,您可以使它完全像您想要的那样(使用监听器等)。所以这是可能的,但可能不是JDBC驱动程序提供的开箱即用的。在核心Java中已经有很多您可能会发现有用的基础设施(线程池、工作者、同步集合)。但是与任何多线程一样,您需要非常小心地同时访问来自不同线程的数据。
从Java7开始,还支持非阻塞I/O(NIO)。这几乎正是你所描述的。I/O被卸载到OS,因此您的操作立即返回,并且在操作完成时获得回调。但是,并不是所有的库都支持NIO。对于我的工作来说,我从来没有理由使用它,因为我总是可以用我的线程实现相同的东西,至少也是一样好的。
本文向大家介绍为什么Java不支持<<相关面试题,主要包含被问及为什么Java不支持<<时的应答技巧和注意事项,需要的朋友参考一下 Java添加了运算符“ >>>”来执行逻辑右移,但是由于 逻辑和算术左移运算是相同的 ,因此Java中没有“ <<<”运算符。 来自Java的Shifts …
问题内容: JTA为什么不支持嵌套事务?是因为实现它们的复杂性(我对此表示怀疑)还是某些设计原则? 问题答案: (正如@Piotr Nowicki指出的那样,JTA 确实 允许嵌套事务,但这不是强制性的可选操作。) 为什么?这是无法确定地回答的问题之一,除非您是做出决定时“在房间里”的人之一。 将嵌套事务作为规范的一部分包括在内可能是固有的复杂性。或当时明显的复杂性;即他们不知道他们知道如何做一个
问题内容: Java为什么不包括对无符号整数的支持? 在我看来,这是一个奇怪的遗漏,因为它们允许人们编写不太可能在意外大的输入上产生溢出的代码。 此外,使用无符号整数可以是一种自我证明的形式,因为它们指示无符号int打算保留的值永远不会为负。 最后,在某些情况下,无符号整数对于某些操作(例如除法)可能更有效。 包括这些的不利之处是什么? 问题答案: 在两行之间阅读时,我认为逻辑是这样的: 通常,J
我注意到netstat的套接字是打开的: 这是意料之中的行为吗?我是否需要显式地将连接头值设置为close以防止这种情况发生?
问题内容: 大家好。我有一个使用ServerSocket和Socket类用Java编写的服务器。 我希望能够检测并处理断开连接,然后在必要时重新连接新客户端。 检测客户端断开连接,关闭套接字然后接受新客户端的正确步骤是什么? 问题答案: 大概是在从套接字读取数据,也许是在输入流上使用包装器,例如BufferedReader。在这种情况下,当相应的读取操作返回-1(对于原始read()调用)或为nu
问题内容: 是否可以让一个线程写入Java的线程,而另一个线程从套接字的线程读取,而不必在套接字上同步线程? 问题答案: 当然。您所描述的确切情况应该不是问题(同时读写)。 通常,如果没有要读取的内容,则读取线程将阻塞,并且如果指定了超时,则读取操作可能会超时。 由于输入流和输出流是Socket中的单独对象,因此您可能要担心的唯一问题是,如果有两个线程试图同时读取或写入(两个线程,相同的输入/输出