Может ли run () возвращать объекты? - PullRequest
2 голосов
/ 04 октября 2011

Предполагая, что это сценарий:

class A extends TimerTask{
  int a;
  public void run(){
    //operation to be performed periodically
  }
}

и

class B{
  int delay=2000,interval=3000;
  A objectA;
  public static void main(String[] args){
    Timer t=new Timer();
    t.scheduleAtFixedRate(new A(),delay,interval);
  }
}

Не может run() вернуть объекты?Если я сделаю такое изменение, будет указана несовместимость.Почему?

Ответы [ 5 ]

5 голосов
/ 04 октября 2011

Используйте FutureTaskFuture) с ExecutorService (см. Примеры на страницах API).


Пример:

public static void main(String[] args) throws Exception {

     FutureTask<String> future = 
             new FutureTask<String>(new Callable<String>() {
         public String call() {
             try {
                 Thread.sleep(1000);
             } catch (InterruptedException e) {
                 e.printStackTrace();
             }
             return "Hello World!";
         }
     });

     ExecutorService executor = Executors.newFixedThreadPool(10);
     executor.execute(future);

     System.out.println(future.get());
}
4 голосов
/ 04 октября 2011

Как вы можете видеть в объявлении метода, возвращаемый тип run является недействительным.Поэтому метод не может напрямую вернуть объект.Но что вы можете сделать, это сохранить объект на уровне экземпляра класса A и объявить метод на A, из которого вы можете получить сохраненный объект, когда его операция завершится

1 голос
/ 04 октября 2011

Имеет тип возврата void. Но вы можете вернуть что-то подобное

Самый простой способ - это хранить его в известном месте. Например, вы можете поместить его в некоторую хеш-таблицу с именем потока в качестве ключа. И это место хеш-таблицы может быть установлено в конструкторе объекта, который выполняется.

0 голосов
/ 04 октября 2011

Тип возврата run() - void, поэтому короткий ответ - нет, вы не можете возвращать объекты.

Если вы хотите получать результаты из кода, который периодически выполняется, вы можете найти ScheduledThreadPoolExecutor полезной альтернативой таймеру. Его schedule методы возвращают ScheduledFuture, из которого вы можете получить результаты.

0 голосов
/ 04 октября 2011

Потому что, если вы заставите его вернуть что-то отличное от void, вы не будете соблюдать контракт переопределенного метода, который объявлен в TimerTask как

public abstract void run();
...