JAva CallableとFutureモード


Javaでは、スレッドを作成するには、Threadクラスを継承する方法と、Runnableインタフェースを実装する方法の2つが一般的です.しかしながら、この2つの方式の欠点は、スレッドタスクの実行が終了した後、実行結果を取得できないことである.タスクの結果を得る目的は、一般に共有変数または共有ストレージ領域、およびスレッド通信のみで実現できます.ただし,Javaでは,CallableとFutureを用いてタスク結果を取得する操作も提供されている.Callableはタスクを実行し、結果を生成し、Futureは結果を得るために使用されます.
Futureの一般的なメソッド:V get():非同期実行の結果を取得します.結果が使用できない場合、このメソッドは非同期計算が完了するまでブロックされます.V get(Long timeout,TimeUnit unit):非同期実行結果を取得し、結果がない場合、このメソッドはブロックされますが、設定したtimeout時間を超えると、このメソッドは異常を放出します.boolean isDone():タスクの実行が終了した場合、正常に終了しても途中でキャンセルしても異常が発生してもtrueに戻ります.boolean isCanceller():タスクが完了する前にキャンセルされた場合はtrueを返します.boolean cancel(boolean mayInterruptRunning):タスクがまだ開始されていない場合、cancel()メソッドを実行するとfalseが返されます.タスクが開始された場合、cancel(true)メソッドを実行すると、タスクスレッドの実行を中断するようにタスクを停止しようとし、停止に成功した場合、trueを返します.タスクが開始されると、cancel(false)メソッドを実行すると、実行中のタスクスレッドに影響を及ぼさず(スレッドが正常に完了するまで実行される)、falseが返されます.タスクが完了すると、cancel(...)メソッドを実行するとfalseが返されます.mayInterruptRunningパラメータは、実行中のスレッドを中断するかどうかを示します.メソッド解析により,実際にFutureは,(1)実行中のタスクを中断できる(2)タスクが完了したかどうかを判断できる(3)タスク実行完了後額の結果を取得できる3つの機能を提供していることも分かった.
  • thread
  • を定義する
    public class CallThread implements Callable {
    
        @Override
        public String call() throws InterruptedException {
            Thread.sleep(1000);
            return "callable and future";
        }
    }
  • テスト
  • @RequestMapping("test-call")
        public void testCall() {
            CallThread callThread = new CallThread();
            ExecutorService executor = Executors.newCachedThreadPool();
            Future submit = executor.submit(callThread);
            try {
                String s = submit.get();
                System.out.println("    :" + s);
            } catch (InterruptedException e) {
                e.printStackTrace();
            } catch (ExecutionException e) {
                e.printStackTrace();
            }
    
        }