代码之家  ›  专栏  ›  技术社区  ›  leeeroy

把未来任务提交给执行者——为什么它能工作?

  •  4
  • leeeroy  · 技术社区  · 16 年前

    我有以下测试代码。

    import java.util.concurrent.ExecutorService;
    import java.util.concurrent.Executors;
    import java.util.concurrent.FutureTask;
    
    class  MyTask extends FutureTask<String>{
        @Override
        protected void done() {
            System.out.println("Done");
        }
    
        public MyTask(Runnable runnable) {
            super(runnable,null);
        }
    }
    
    public class FutureTaskTest {
    
        public static void main(String[] args)  {
            ExecutorService executor = Executors.newSingleThreadExecutor();
            FutureTask<String> future = new MyTask(new Runnable() {
                public void run() {
                    System.out.println("Running");
                }
            });
    
            executor.submit(future);
    
            try {
                future.get();
            } catch (Exception ex ) {
                ex.printStackTrace();
            }
            executor.shutdownNow();
    
        }
    }
    

    这很好-当任务完成时调用MyTask中重写的“done”方法。 但是执行者怎么知道怎么称呼它呢?

    执行人只有以下提交方法:

    public <T> Future<T> submit(Callable<T> task);
    public Future<?> submit(Runnable task);
    

    在内部,它似乎将可调用/可运行包装在一个新的futuretask()中。 就执行者而言,我已经提交了一个可运行的或可调用的——从这两个签名中收集到的信息。 它如何知道我提交了一个FutureTask并知道如何调用我的overrided done()?

    2 回复  |  直到 16 年前
        1
  •  7
  •   erickson    16 年前

    从执行者的角度来看,您已经提交了 Runnable 任务。这个 run 此任务的方法(由 FutureTask 是什么呼唤 done 在适当的时间。执行人没有直接打电话给 完成 .

        2
  •  1
  •   Jacob Mattison    16 年前

    执行器不调用Done()。完成对run()的调用后,futureTask将调用done()。