Java 阻止I/O与NIO连接到Android中的四个不同设备

Java 阻止I/O与NIO连接到Android中的四个不同设备,java,android,nio,Java,Android,Nio,我正在编写一个Android应用程序来同时升级四个五个医疗设备的固件。我应该使用传统的阻塞i/O方法(采用每连接线程的方法)还是非阻塞NIO方法 这个程序已经可以一次升级一台设备了 这里什么会有更大的开销?java NIO开销或上下文切换开销 任何帮助都将不胜感激 如果设备的数量是四到五台,并且在短期内不会以至少两个数量级的速度增长,我建议您坚持使用阻塞I/O和每个连接的线程模型,因为它很简单,而且在这种情况下,您不太可能看到NIO的任何性能改进,而且性能下降实际上是很有可能的。线程切换工作得很

我正在编写一个Android应用程序来同时升级四个五个医疗设备的固件。我应该使用传统的阻塞i/O方法(采用每连接线程的方法)还是非阻塞NIO方法

这个程序已经可以一次升级一台设备了

这里什么会有更大的开销?java NIO开销或上下文切换开销


任何帮助都将不胜感激

如果设备的数量是四到五台,并且在短期内不会以至少两个数量级的速度增长,我建议您坚持使用阻塞I/O和每个连接的线程模型,因为它很简单,而且在这种情况下,您不太可能看到NIO的任何性能改进,而且性能下降实际上是很有可能的。线程切换工作得很好,甚至可以执行比4或5更多的任务,而且编程模型要简单得多。如果通信代码使用套接字,那么使用NIO可能有一个优势,因为选择器允许您比IO流更好地检测某些类型的断开连接。然而,即使在这种情况下,我也建议在每个客户机的线程模型中使用NIO,因为它可能会为您节省大量的代码工作

java NIO开销或上下文切换开销

这是个错误的问题。NIO没有太多的开销,但是您必须在应用程序中自己实现“上下文切换”,您不能假装NIO已经消失了。。。在通道之间调度的代码可能不如操作系统的线程调度程序有效。真正的问题是,与大大增加的NIO代码复杂性相比,线程和更具体地说线程堆栈中的节省是否有任何意义。除非你打算为数以万计的连接提供服务,否则通常不会


值得注意的是,使用选择器的NIO模型起源于线程之前,即在更复杂的代码和更多进程之间进行选择的时候。现在有一个重要的学派认为,在几乎所有情况下都应该使用阻塞I/O和线程。我想Peter Lawrey在某个地方写了一份研究报告和一篇论文,但我手头没有引证。

老实说,考虑到您将要升级的设备可能具有关键的应用,我会坚持一次升级一个设备,并确保没有bug。@Marcelo我们已经测试过一次升级一个设备,并且它工作正常[具有阻塞I/O功能]。现在我们想将其扩展到同时升级多个设备(比如4-5台)。为此,我们要确定最佳方法。每连接一个线程阻塞I/O与非阻塞NIO的复杂性it所涉及的I/O至少从项目管理的角度来看,使用您已经拥有(并经过测试)的代码并创建某种运行多个线程的
ExecutorService
是有意义的。然后,如果您确实遇到性能问题,您可以采取一些措施…@Michel感谢Michal的输入。@Michel感谢Michal的输入。我非常倾向于阻塞I/O方法。我将在我的团队面前展示这一点。我担心的是,对于五个连接,总共有10个线程(每个设备一个用于tx,另一个用于rx)。这取决于代码将执行的通信类型。如果是某种查询响应协议,则可以从单个线程执行读写操作。但即使每个核心10个线程也不算多(我说的是桌面或服务器级机器,不能说是嵌入式设备)。我假设您的线程将花费大部分时间等待I/O,因此在这种情况下,线程数比CPU多没有问题。这是一个有趣且深思熟虑的输入。