私がFutures
のように使用している場合
List<Future<String>> results = executorService.invokeAll(tasks);
また
Future<String> res = executorService.submit(new SingleWorker());
System.out.println(res.get());
システムはタスクが完了するのを待ちます。
executorService.shutdownNow();
上記のステートメントの後にあったとしても、ドキュメントに記載されているように、システムが既存のスレッドを強制的に終了する時期が本当にわかりません。タスクが完了して未来が返されるまで、システムはラインに到達しないためです。何か足りないのですか?それをテストするための別のテストケースシナリオはありますか?
私たちが言うとき、ie
shutdownNow
でのみ動作しますか?Runnable
executorService.submit(new MyRunnable())
編集:
私はいくつかの異なることを試してみましたが、
a)shutdownNow
では動作しませんinvokeAll
。
b)その後shutdownNow
存在する場合Future.get
、ステートメントは解決されるまでshutdownNow
ブロックされます (の場合)。 Future
Callable
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
です。
肝心なのはinvokeAll
、Future.get
操作をブロックしていることです。誰かが検証してもらえますか?