2013-03-11 73 views
-4

我想创建一个类是IS0 TimerTaskThread。我认为这个想法没有错。我在这篇文章here的“期望输出”部分提到了我这样做的原因。替代TimerTask,它支持等待完成?

Java类不能从两个类继承。那么,我该如何解决这个问题呢?

原因是我在我的问题中提到的帖子。

实际输出: 所有计时器任务都在主方法中执行。我的主代码的最后一个打印语句在所有计时器任务执行之前显示。我不想那样。

预期输出: 我希望main的最终打印语句在所有其他之后。

+2

“我想创建一个类是一个TimerTask,也是一个线程”为什么? – Cephalopod 2013-03-11 09:09:50

+0

@Arian - 原因是我在我的问题中提到的帖子。所有计时器任务都在主要方法中执行。我的主代码的结束打印语句显示在所有计时器任务执行之前。我不想那样。我希望main的最终打印语句能够在其他所有内容之后出现。 – Time 2013-03-11 09:13:17

+0

你应该为你的问题提出一个不同的问题,而不是质疑设计逻辑 – rajesh 2013-03-11 09:15:49

回答

5

你在问错误的问题。 Java中不可能有多重继承,但这不是你的实际目标。

你想要的是能够等待多个定时任务完成。有几种方法可以实现这一点。

也许最直接的就是使用ScheduledExecutionService,它会给你一个Future,你可以等待,类似于你习惯的join方法。

另一种方法是使用CountDownLatch让每个定时器任务在完成时递减锁存器;然后您可以使用await等待他们完成。

还有一种策略是使用waitnotify原语自己构建同步 - 您的问题也不难解决这种问题。

+0

思考但是,貌似还有一个问题 - 现在http://code.nomad-labs.com/2011/12/09/mother-fk-the-scheduledexecutorservice/ 不是很确定 – Time 2013-03-11 10:16:04

+0

你期望什么样的例外?如果他们不应该导致任务被取消,那么你应该在你的任务中处理它们,否则他们会当你获得'未来'时,就会重新提出'ExecutionException'。至于停止后续执行,只有在抛出未捕获的异常时才会发生。我不确定我看到了问题。 – 2013-03-11 15:13:25

9

TimerTask的扩展和实现Runnable

编辑重申原来的问题后提出:检查https://stackoverflow.com/a/4951059/869488

+9

'TimerTask'本身实现'Runnable'。所以这是没有意义的。 – uba 2013-03-11 09:10:58

+1

是的,我现在正在检查。无论如何,我在检查文档之前输入了我想到的第一件事情:) – rajesh 2013-03-11 09:11:41

+0

这是如何得到7 upvotes而我的问题得到3 downvotes?不公平的:( – Time 2013-03-11 09:16:09

1

可以实现Runnable接口。

class BulbJob extends TimerTask implements Runnable 
{ 

    public void run() 
    { 

    } 
} 
+0

TimerTask的本身实现了Runnable,所以这是没有意义的。 – Time 2013-03-11 09:18:17

+0

我们对此深感抱歉...我注意到它使用ScheduledExecutorService的现在 – Joe2013 2013-03-11 10:22:57