タイムアウトが必要な JNI から関数を呼び出したいコードを実装しようとしています。タイムアウトを超えたら、ネイティブタスクを終了させたい。例として示すコードを投稿しています。
void myFunction(timeOutInSeconds)
{
if(timeOutInSeconds > 0)
{
ExecutorService executor = Executors.newCachedThreadPool();
Callable<Integer> task = new Callable<Integer>() {
public Integer call() {
System.out.println("Calling JNI Task");
JNI_Task();
System.out.println("Finished JNI Task");
return 0;
}
};
Future<Integer> future = executor.submit(task);
try
{
@SuppressWarnings("unused")
Integer result = future.get(timeOutInSeconds, TimeUnit.SECONDS);
}
catch (TimeoutException ex)
{
// handle the timeout
kill_task_in_JNI();
// future.cancel(true);
return TIMEOUT;
} catch (InterruptedException e) {
// handle the interrupts
} catch (ExecutionException e) {
// handle other exceptions
}
finally
{
// future.cancel(true);
executor.shutdown();
}
}
else
JNI_Task();
}
いくつか質問があります -
- future.cancel() を正確にどこに置くべきですか。コメントされている場所は 2 つあります。
- この関数を timeOutInSeconds = 0 で実行すると、完全に実行されます。ただし、timeOutInSeconds の値に関係なく、タスクが停止し、JNI タスクが呼び出されません。これを確認するには、JNI コードに printf を入れます。タスクの実行には 1 秒かかり、30 秒、5 分などを指定しましたが、まだスタックしています。
そのようなアプローチに問題はありますか?