У меня есть следующий тестовый код.Отправлять будущие задания исполнителю - почему он работает?
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();
}
}
Это прекрасно работает - переопределенный «сделал» Methond в MyTask вызывается, когда задача выполнена. Но как исполнитель знает, как это назвать?
Исполнителя только эти методы представить:
public <T> Future<T> submit(Callable<T> task);
public Future<?> submit(Runnable task);
Внутренне он кажется «представить» обертывание вызываемой/работоспособный в новом FutureTask(). Что касается исполнителя, я представил Runnable или Callable - из того, что я собираю из этих двух подписей. Как он узнал, что я представил FutureTask и знаю, как назвать мой переопределенный done()?