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