可以run()返回对象吗?

时间:2011-10-04 07:57:54

标签: java runnable timertask

假设这是场景:

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 个答案:

答案 0 :(得分:5)

FutureTask使用Future(和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());
}

答案 1 :(得分:4)

正如您在方法声明中所看到的,run的返回类型为void。因此该方法不能直接返回对象。但你可以做的是将对象存储在类A的实例级别,并在A上声明一个方法,当它的操作完成时,你可以从中获取存储的对象

答案 2 :(得分:1)

它具有无效返回类型。 但你可以让它返回像这样的东西

最简单的方法可能是将其存储在已知位置。例如,您可以将其放在一些哈希表中,并将线程名称作为键。并且可以在runnable对象的构造函数中设置此哈希表位置。

答案 3 :(得分:0)

因为如果你让它返回void以外的其他内容,你就不会尊重你覆盖的方法的合同,这在TimerTask中声明为

public abstract void run();

答案 4 :(得分:0)

run()的返回类型为void,因此简答为否,您无法返回对象。

如果要从定期执行的代码中检索结果,您可能会发现ScheduledThreadPoolExecutor是Timer的有用替代方法。其schedule方法返回ScheduledFuture,您可以从中检索结果。