我有一个程序通过JNI使用FFMPEG二进制库。有一个调用打开一个在本机代码中阻塞的URL,我需要允许用户手动取消此连接。有时Thread.interrupt()就像它应该的那样工作(如果我连接的url是“udp:// {whatever}”)。如果我的URL是“rtp:// {whatever}”,则Thread.interrupt()似乎不受本机线程的尊重。 Thread.kill()似乎甚至没有这样做(并且无论如何通常都不满意。)
有没有人知道通过JNI中断或杀死本机线程的不同方法?
答案 0 :(得分:2)
看一看Xuggle如何做到这一点(JNI对FFmpeg来说是一个wapper)。每当FFmpeg调用它的中断回调时,Xuggler调用Java来查看线程是否被中断,如果是,则返回true。
答案 1 :(得分:1)
本机代码可以定期检查线程,看它是否被中断,就像Java代码一样。
另一种方法是特定于操作系统的,但你可以向线程发送一个信号,该信号可以设置一个标志 - 这对于JNI方面来说可能更为直接。
所有线程停止都是合作的 - 你通过设置一个标志(通过Thread.interrupt()
或信号处理程序中设置的标志)告诉线程停止 - 线程代码经常检查这个。