0

私がFuturesのように使用している場合

List<Future<String>> results = executorService.invokeAll(tasks); 

また

Future<String> res = executorService.submit(new SingleWorker());
System.out.println(res.get());

システムはタスクが完了するのを待ちます。

executorService.shutdownNow();上記のステートメントの後にあったとしても、ドキュメントに記載されているように、システムが既存のスレッドを強制的に終了する時期が本当にわかりません。タスクが完了して未来が返されるまで、システムはラインに到達しないためです。何か足りないのですか?それをテストするための別のテストケースシナリオはありますか?

私たちが言うとき、ie shutdownNowでのみ動作しますか?RunnableexecutorService.submit(new MyRunnable())

編集:

私はいくつかの異なることを試してみましたが、

a)shutdownNowでは動作しませんinvokeAll

b)その後shutdownNow存在する場合Future.get、ステートメントは解決されるまでshutdownNowブロックされます (の場合)。 FutureCallable

c)shutdownNowと完全に連携しRunnableます。

以下は、テスト用に記述された私のコードです。

class SingleRunnableWorker implements Runnable {

    @Override
    public void run() {
        System.out.println("SingleRunnableWorker Running..");
        try {
            Thread.sleep(10000);
            System.out.println("SingleRunnableWorker Running after sleep..");
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }

}

class SingleCallableWorker implements Callable<String> {

    @Override
    public String call() throws Exception {
        System.out.println("SingleCallableWorker Calling..");
        Thread.sleep(10000);
        System.out.println("SingleCallableWorker Calling after sleep..");
        return "SingleCallableWorker Calling done";
    }

}

そして私は次のようにそれをテストしています:

ExecutorService executorService = Executors.newFixedThreadPool(4);
/*List<Future<String>> results = */executorService.invokeAll(tasks);//blocks by default

Future<String> res = executorService.submit(new SingleCallableWorker());
//System.out.println(res.get()); //blocks if uncommented

executorService.submit(new SingleRunnableWorker());

executorService.shutdownNow();

ここで、タスクは allCallablesです。

肝心なのはinvokeAllFuture.get操作をブロックしていることです。誰かが検証してもらえますか?

4

1 に答える 1