4

タイムアウトが必要な 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 分などを指定しましたが、まだスタックしています。

そのようなアプローチに問題はありますか?

4

1 に答える 1

3

future.cancel()あなたはfinallyブロックでのみ呼び出すことができます(そしてこの場合はそうすべきです) 。http://docs.oracle.com/javase/tutorial/essential/exceptions/finally.html

2番目の質問については、timeOutInSeconds=0のときにも問題が発生するかどうかはわかりません。これは本当ですか?JNI_TASK()メソッドの内容を提供できますか?

于 2012-05-29T15:36:13.800 に答える