假设这是场景:
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()
无法返回对象吗?如果我做出这样的改变,就会引用不兼容性。为什么呢?
答案 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
,您可以从中检索结果。