Отправка FutureTasks Исполнителю - почему это работает? - PullRequest
4 голосов
/ 10 ноября 2009

У меня есть следующий тестовый код.

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 ()?

Ответы [ 2 ]

7 голосов
/ 10 ноября 2009

С точки зрения исполнителя, вы отправили задачу Runnable. Метод run этой задачи (реализованный FutureTask) - это то, что вызывает done в соответствующее время. Исполнитель не делает прямого звонка на done.

1 голос
/ 10 ноября 2009

Исполнитель не вызывает done (). done () вызывается FutureTask по завершении вызова run ().

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...