2

假设这是场景:

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()返回对象?如果我进行这样的更改,则会引用不兼容。为什么?

4

5 回答 5

4

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

于 2011-10-04T08:05:03.800 回答
4

使用FutureTask(and Future) with 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());
}
于 2011-10-04T08:01:43.913 回答
1

它具有 void 返回类型。但是你可以让它返回这样的东西

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

于 2011-10-04T08:20:53.397 回答
0

因为如果你让它返回的东西void不是TimerTask

public abstract void run();
于 2011-10-04T08:02:28.370 回答
0

的返回类型run()void,所以简短的回答是否定的,你不能返回对象。

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

于 2011-10-04T08:16:58.950 回答