我有以下测试代码.
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();
}
}
Run Code Online (Sandbox Code Playgroud)
这很好 - 在任务完成时调用MyTask中被覆盖的'done'方法.但是遗嘱执行人如何知道如何称呼它?
执行者只有这些提交方法:
public <T> Future<T> submit(Callable<T> task);
public Future<?> submit(Runnable task);
Run Code Online (Sandbox Code Playgroud)
在内部,似乎'submit'将callable/runnable包装在一个新的FutureTask()中.就执行者而言,我已经提交了一个Runnable或Callable - 从我从这两个签名中收集到的内容.它是如何知道我提交了FutureTask并知道如何调用我的重写的done()?
从遗嘱执行人的角度来看,您已经提交了一项Runnable任务.run此任务的方法(由...实现FutureTask)是done在适当的时间调用的.遗嘱执行人不会直接致电done.
| 归档时间: |
|
| 查看次数: |
2715 次 |
| 最近记录: |