我有以下测试代码。
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()?