有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

为什么Javasocket不支持中断处理?

我一直在思考为什么JDBC只是阻塞操作,为什么我不能为假设的事件处理程序onResultSetArrived(ResultSetRS)设置一些侦听器。为什么我必须为每个JDBC查询阻塞一个线程

过了一段时间,我深入研究了Javasocket(我想JDBC是在它们之上构建的),并意识到也没有任何事件处理。提供非阻塞读取的唯一选项是通过available()方法,但这是非常低效的,因为它必须在循环中定期检查

据我所知,中断是PC机的基本问题。它从硬件一直到操作系统。在Java中,它可以通过从socket读取值实现为事件驱动方法

现在,我的问题是我是否遗漏了一些东西,并且存在一些解决方法,或者Java中当前的体系结构是否真的是每个阻塞操作一个线程如果是,不是效率低下


共 (2) 个答案

  1. # 1 楼答案

    如果问题是“Java中当前的体系结构是否真的是每个阻塞操作一个线程”,那么“阻塞操作”的意思是“数据库操作”,那么答案是否定的。目前大多数Java可用的数据库驱动程序都是基于jdbc的,并以这种方式工作。但是有可用的替代品(https://spring.io/blog/2016/11/28/going-reactive-with-spring-data)和更多( https://blogs.oracle.com/java/jdbc-next:-a-new-asynchronous-api-for-connecting-to-a-databasehttps://dzone.com/articles/spring-5-webflux-and-jdbc-to-block-or-not-to-block)。有关其工作原理,请参见How is ReactiveMongo implemented so that it is considered non-blocking?

    对于jdbc,还有一些方法可以包装jdbc调用(Wrapping blocking I/O in project reactorSpring webflux and reading from database)和采用这种方法的项目(https://dzone.com/articles/myth-asynchronous-jdbc

  2. # 2 楼答案

    在Java中,可以有许多线程。线程一直在做自己的事情,直到它被阻塞在某个地方(通常是在互斥锁或I/O操作上)。当然,这不会阻止其他线程

    多线程应用程序的基本场景是,在等待阻塞线程时使用多个线程会导致太多的等待。这里“太多”的定义完全取决于您,但一般来说,这就是如何通过更好地利用资源来实现更好的性能

    然而,Java中线程的工作方式存在一些限制。如果不是所有线程都被阻塞在Java“外部”的某个地方,例如OS调用或外部(本机)库中,那么大多数线程都被阻塞。理论上,如果本机代码阻塞线程,Java对此无能为力。通常,除非本机代码有bug,否则这不应该是问题

    所以,在阻塞JDBC响应的情况下,您将创建一个新线程,该线程将在第一个线程等待数据库完成时执行其他工作。或者,您可以创建一个线程,只用于执行JDBC。除了操作系统施加的限制外,您可以完全按照自己的意愿(使用侦听器等)进行设置。所以这是可能的,但它可能不是由JDBC驱动程序提供的。核心Java中已经有很多基础设施,您可能会发现它们很有用(线程池、工作线程、同步集合)。但与任何多线程一样,您需要非常小心地同时访问来自不同线程的数据

    自Java7以来,还支持非阻塞I/O(NIO)。这几乎就是你所描述的。I/O被卸载到操作系统,因此您的操作会立即返回,并且在操作完成时会收到回调。但是,并非所有库都支持NIO。对于我的工作,我从来没有理由使用它,因为我总是可以用我的线程实现相同的东西,至少同样好