将FutureTasks提交给执行者 - 为什么它有效?

时间:2009-11-10 19:41:26

标签: java oop

我有以下测试代码。

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);

在内部,似乎'submit'将callable / runnable包装在一个新的FutureTask()中。 就执行者而言,我已经提交了一个Runnable或Callable - 从我从这两个签名中收集到的内容。 它是如何知道我提交了FutureTask并知道如何调用我的重写的done()?

2 个答案:

答案 0 :(得分:7)

从遗嘱执行人的角度来看,您已经提交了Runnable任务。此任务的run方法(由FutureTask实施)是在适当的时间调用done的方法。遗嘱执行人不会直接致电done

答案 1 :(得分:1)

执行程序不会调用done()。当对run()的调用完成时,FutureTask会调用done()。