[英]Best way to block / show “Working…” notification when calling a time-consuming Java command externally
[英]java thread blocked when calling a time-consuming native method
我有一個線程將調用本機方法。 而且我不知道為什么當線程調用本機方法時,它將始終停止並等待本機方法完成。 本機方法完成后,線程將繼續運行。 問題在於本機方法非常耗時。 但是我希望即使本地方法仍在運行,我的Java線程仍繼續運行。我不希望Java線程停止並等待。
本機方法是一個jni函數,它將調用由matlab編碼器生成的c文件。在matlab中運行時,該代碼僅需1秒。 但是在Android中運行需要15秒。
我的項目的簡短演示:
在Java中:
new Thread(new Runnable() {
@Override
public void run() {
//record and get audio samples in real-time as an input to native method
//call native method
//print the result from native method
}).start();
在本機方法中:
JNIEXPORT jobjectArray JNICALL
Java_com_example_user_MyProject_MainActivity_getpitch(JNIEnv *env, jobject instance,jdoubleArray array_) {
//call c function generated by matlab (the input is the array we get from java)
//return the results calculated by the c function to java
}
我的問題是,即使本機方法尚未完成,如果我希望我的java線程繼續運行,是否有任何解決方案。(因為我需要實時獲取音頻樣本。如果線程停止,它將無法獲得音頻樣本,然后我們將錯過許多樣本。)
再次抱歉我的英語不好。。這是我第一次發布問題。
為什么我的Java線程會停止並等待本機方法完成?
線程順序執行代碼。 在本地調用完成之前,它將不會執行代碼。
如果我想讓我的java線程即使本機方法尚未完成仍繼續運行,是否有任何解決方案?
然后使用兩個線程:一個用於阻塞對本機庫的調用,另一個用於執行您想發生的其他事情。
我不知道為什么當線程調用本機方法時,它將始終停止並等待本機方法完成。
嗯,這就是調用Java方法時發生的事情,對吧? 如果你寫這個;
foo(...);
bar(...);
其中foo()
是一個普通的Java方法,那么你就不會想到bar(...)
之前進入foo(...)
的回報,對不對?
那么,如果foo()
恰好具有本機實現,那么為什么您的期望會有所不同呢?
考慮一下:假設您是一些純Java圖形庫的作者,並且假設您決定發布一些新的,更快的版本,其中包含一些公共方法的本機實現。 如果將方法更改native
完全改變了他們調用它時會發生的事情,誰會想要移植他們的代碼以使用您的新版本?
您可以使用可運行但可異步的Callable對本地代碼進行異步調用,然后可以使用Future對象查詢結果。
公共類TestCallable實現Callable {
@Override
public String call() throws Exception {
//return the thread name executing this callable task
return yourNativeCall();
}
]
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.