2009-11-10 4 views
4

У меня есть следующий тестовый код.Отправлять будущие задания исполнителю - почему он работает?

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

ответ

7

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

1

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

Смежные вопросы