有 Java 编程相关的问题?

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

java Android USB附件多线程

我有一个由多线程和安卓开放附件引起的问题

我需要与USB附件通信,但我需要从两个线程进行通信。一个线程生成并发送数据,另一个线程读取数据

  • 为什么我不用一根线?因为在读之前可能会有一次或多次写操作,并且读操作被阻塞,所以这不是一个选项

  • 如果使用多个线程,我迟早会遇到“I/O错误(没有这样的设备)”,因为读与写之间会发生冲突;同时执行的写操作

  • 锁定或多或少会让我回到单线程的状态,所以不太好

  • 不支持input-stream返回的.available()方法,因此在执行读取之前,我无法检查是否有可用的内容

  • 因为它不是基于socket的流,所以我也不能设置超时

  • 我试着从USBAccessory获取FileDescriptor并传递给JNI在那里处理它,但在第一次读/写之后,设备变得不可访问

需要的问题/建议:
对此,建议/最佳实践方法是什么?我不需要编写代码,我只需要一些关于如何解决这个问题的指导

澄清一下:
另一端的软件可能会也可能不会响应任何数据。有一些所谓的静默发送是指刚刚收到的数据发送,但没有确认。由于我正在开发的应用程序只是一个代理,我不清楚数据是否会产生答案。这也需要对数据进行分析,目前还没有记录在案


共 (2) 个答案

  1. # 1 楼答案

    If using multiple threads, I do run into I/O Error (No such device) sooner or later, because I will have a collision between read & write being executed at the same time.

    这说明了一切。由于您在不支持并发访问的同一个通道上执行读写操作,因此需要让您的线程等待另一个线程完成读写操作

    你的双线程方法或多或少是我会做的。祝你好运,相信自己

  2. # 2 楼答案

    当你想同时读写时,如果读和写在同一部分,写总是会导致暂停读

    可能您可以遵循与ConcurrentHashMap类似的方法,对不同的段使用不同的锁,如果写入在同一段上,则锁定只读,否则允许读取

    这会

    1. 在大多数情况下,避免在写入期间阻塞读取
    2. 避免碰撞和碰撞
    3. 绝对不会是单线程方法

    希望有帮助