我正在与 Android 中的已知错误作斗争,即无法解除阻塞的 USB 读取线程 - 期间。没有什么可以解除它;不关闭底层对象(通常使用套接字),不使用 NIO 并调用 FileChannel.close(向阻塞线程发送异常),什么都没有。所以我一直在制定某种解决方法来容忍 Android 中的这个错误。
最大的问题是,由于线程不会死,它保留了对底层 FileInputStream 对象(或 FileChannel 对象,或您正在使用的任何东西)的引用。由于该对象仍然存在,因此您无法与连接的 USB 设备重新关联。您会收到众所周知的“无法打开 /dev/usb_accessory”的绝望消息。
所以......由于线程不能被外部终止或中断,并且由于它不会自行唤醒以释放对象,我想知道操作系统何时清理这样一个阻塞的线程及其相关资源. 在大多数操作系统中,线程将是整个进程的一部分,当该进程终止时,所有线程和对象将同时被清理 - 从而最终释放 USB 连接,以便其他东西可以与之关联。但实验表明线程或对象可能存在于进程之外。我不知道如何以及在什么情况下,但到目前为止,即使在前一个进程终止(!?!)之后,我仍然收到“无法打开 /dev/usb_accessory”的消息。
那么......最终是什么清理了与进程相关的所有内容,包括它的所有线程和实例对象?我如何“清白”,让新进程在与 /dev/usb_accessory 关联方面有新的尝试?
谢谢!