Java线程、阻塞I/O和调度

1l5u6lss  于 2023-03-16  发布在  Java
关注(0)|答案(1)|浏览(188)
  • 下面的场景经过简化 *

服务器是一个4核英特尔(无超线程)Linux服务器,Java 11服务器64虚拟机。我们有一个线程池执行器与15个线程的最大大小。
一个使用Executor的方法提交4个Callable,它们执行长时间运行的数据库调用,另一种方法是使用Executor提交10个以上的执行程序来进行快速计算。2前4个线程获取CPU时间,然后阻塞等待查询返回。3我的问题有两个--DB调用是否类似于阻塞I/O,并且当新的可调用项被提交并被分配给线程时,那些线程将开始运行,而其它线程正在等待DB调用返回,或者它们会被排队吗?我知道有很多变量我在这里没有涉及,如果它们是相关的,请指出它们,但我认为基本问题是相当清楚的。

huus2vyu

huus2vyu1#

DB调用是否与阻塞I/O类似
是的,涉及JDBC的调用会阻塞,从而暂停Java线程下的宿主OS线程。至少目前,在Java 11和Java 17 & 19中是这样。
如果Project Loom成功,此事实可能会改变。
当新的可调用对象被提交并分配给线程时,这些线程是否会在其他线程等待DB调用返回时开始运行,或者它们是否会排队?
如果支持执行器服务的线程池中的所有线程都被阻塞,或者处于忙碌/占用状态,则挂起的任务将与其他提交的任务一样排队。这种排队是执行器服务的主要工作。
同样,Project Loom及其虚拟线程旨在改变这种情况。
服务器是4核Intel(无超线程)...最大大小为15个线程
您是否怀疑较短的simply调用会堆积在占用所有线程的较长阻塞数据库调用后面,就像高速公路上一些快速的小通勤汽车堵在缓慢的semi-trailer trucks车队后面一样。
如果是这样,请考虑示例化 * 两个 * 执行器服务。

  • 将一个执行器服务专用于长阻塞数据库调用。
  • 将另一个执行器服务专用为所有其他较短的简单调用的“快速通道”。

相关问题