类已继承其他类时,如何实现TimerTask及创建每5秒执行的任务?
解决单继承下的定时任务实现问题
嘿,这个问题我太懂了!因为Java是单继承机制,你的BlueSlime已经继承了Slime类,自然没法再继承TimerTask了——不过完全不用慌,有好几种优雅的方式能实现你每5秒运行一次任务的需求,我给你一一拆解:
方案1:用Runnable配合Timer实现
不用让BlueSlime继承TimerTask,咱们可以实现Runnable接口(这是个函数式接口,写起来很简洁),然后用Timer来调度这个任务。示例代码如下:
public class BlueSlime extends Slime implements Shootable { // 初始化Timer private Timer taskTimer = new Timer(); public BlueSlime() { // 调度任务:每5秒执行一次,初始延迟0秒立即开始 taskTimer.scheduleAtFixedRate(new TimerTask() { @Override public void run() { // 这里写你要每5秒执行的逻辑 doRepeatedTask(); } }, 0, 5000); // 或者用lambda简化(Java 8+支持) // taskTimer.scheduleAtFixedRate(() -> doRepeatedTask(), 0, 5000); } private void doRepeatedTask() { // 你的定时任务逻辑,比如发射子弹、移动之类的 System.out.println("BlueSlime执行定时任务..."); } // 记得在合适的时机停止Timer,比如对象销毁时 public void stopTimer() { taskTimer.cancel(); } }
这里用匿名内部类继承了TimerTask,但你的BlueSlime本身不用继承它,完美绕开单继承限制。
方案2:使用ScheduledExecutorService(更推荐)
这是Java并发包java.util.concurrent里的工具,比Timer更可靠——比如它能处理任务抛出的异常,还支持线程池管理,适合更复杂的场景。示例代码:
import java.util.concurrent.Executors; import java.util.concurrent.ScheduledExecutorService; import java.util.concurrent.TimeUnit; public class BlueSlime extends Slime implements Shootable { private ScheduledExecutorService scheduler = Executors.newSingleThreadScheduledExecutor(); public BlueSlime() { // 调度任务:初始延迟0秒,之后每5秒执行一次 scheduler.scheduleAtFixedRate(this::doRepeatedTask, 0, 5, TimeUnit.SECONDS); } private void doRepeatedTask() { // 你的定时任务逻辑 System.out.println("BlueSlime执行定时任务..."); } // 停止调度器,释放资源 public void shutdownScheduler() { scheduler.shutdown(); } }
这个方案代码更简洁,而且ScheduledExecutorService的功能比Timer强大很多,是生产环境里的首选。
关于其他可用的Task类型
当然有!除了TimerTask,你还可以用这些:
Runnable:最基础的无返回值任务接口,刚才的方案里已经用到了,适合不需要结果的简单任务Callable<V>:如果你的定时任务需要返回结果,可以用这个接口,配合ScheduledExecutorService的schedule方法,能拿到ScheduledFuture<V>对象来获取结果或取消任务ScheduledFuture<V>:这是调度任务后的返回值,它既是Future(能获取结果)又是Delayed(能处理延迟),可以用来跟踪任务状态- 如果是用Spring框架的项目,还可以用
@Scheduled注解,直接在方法上标记定时任务,配置起来更省心
内容的提问来源于stack exchange,提问作者Ryan Sangha
相关产品推荐
相关产品推荐

