1

将来のタスクを作成し、Executor に送信しました。run() メソッドで、placementPlanner のオブジェクトを作成しました。このクラスのメソッドは、他のクラスを呼び出します。ただし、executor.shutDownNow() を呼び出すと、呼び出された内部メソッドは実行を停止しません。すべての子スレッドを強制終了し、メソッドの呼び出しを停止する方法を呼び出します。コードは以下です。

static List<Result> invokePlacementPlannerWithTimeout(int timeoutSecs,
        final String requestType, final RequestMap requestMap,
        final ReleaseMap releaseMap, final SysConfig systemConfig,
        final Request request, final SigmaBlade hostData,
        final ServiceLevelData serviceLevelData,
        final List<Service> serviceList, final String transactionID) throws IOException {

    /**
     * Object of ExecutorService interface used for timed execution of Placement
     * Planner.
     */
    ExecutorService executor = Executors.newFixedThreadPool(1);
    /**
     * Creating a final List of Result type.
     */
    final List<Result> resultList = new ArrayList<Result>();
    /**
     * set the executor thread working
     */
    Future<?> future = executor.submit(new Runnable() {

        public void run() {

            try {
                Result result = new Result();
                PlacementPlanner planner = new PlacementPlanner();

                result.setRequestMapACK(planner.getRequestResult(
                            requestMap, systemConfig, request, hostData,
                            serviceLevelData, transactionID,
                            configFileLocation));

                resultList.add(result);
            } catch (Exception e) {
                System.out.println("Exception in run method in invokePlacementPlannerWithTimeout method in Controller");
                throw new RuntimeException(e);
            }
        }

    });

    try {
        /**
         * invoking the future task with specified timeout.
         */
        //  System.out.println(timeoutSecs);
        future.get(timeoutSecs, TimeUnit.MILLISECONDS);

        /**
         * Shutting down the service after successful execution.
         */
        executor.shutdownNow();
    } catch (Exception e) {
        /**
         * Shutting down the service if timeout is occured.
         */
        executor.shutdownNow();

        /**
         * Canceling the task for future use.
         */
        future.cancel(true);

        System.out.println("Timeout Occureed.");
        Runtime.getRuntime().exec("taskkill /F /IM " + "QNSim.exe*");
    }
    return resultList;
}
4

3 に答える 3

6

javadocに従って

アクティブに実行中のタスクの処理を停止するための最善の努力以外の保証はありません。たとえば、典型的な実装は Thread.interrupt() によってキャンセルされるため、割り込みに応答しないタスクは決して終了しない可能性があります。

そのため、shutdownNow()タスクがすぐに終了することを保証するものではありません。

于 2012-10-23T20:10:46.723 に答える
2

そのスレッドを本当にThread.stop()停止する必要がある場合は、これを行う唯一の効果的な方法ではないため、非推奨の使用を検討してください。@deprecatedただし、javadocのセクションを注意深く読んだ後でのみです。

(この回答には多くの反対票が寄せられると思います)。

于 2012-10-23T20:53:55.937 に答える
1

値が true の future.cancel()場合に実行中のタスクを中断するタスクをキャンセルする場合に使用する必要があります。最終的に は、やりたくないスレッドをキャンセルしようとします。mayInterruptIfRunningshutdownNowThread.interrupt()

もう 1 つの方法は、実行メソッドでThread.isInterrupted()ステータスを確認することです。それが true の場合、単に壊れてから、呼び出したときにコードが壊れますshutdownNowcancel

于 2012-10-23T20:12:50.607 に答える