Java 使用一个计时器处理多个TimerTask

Java 使用一个计时器处理多个TimerTask,java,timer,timertask,Java,Timer,Timertask,有了一个TimerTask,一切看起来都很简单,工作正常。 但我不能在一个计时器内处理不同的“TimerTask”。 我尝试将TimerTask对象添加到构造函数中,但在将新的TimerTask(RemindTask1)对象作为参数(内部类的实例)传递时出现编译错误 以下是它如何处理一项任务: public class MyTimer { Timer timer; public MyTimer(long time) { timer = new Timer();

有了一个
TimerTask
,一切看起来都很简单,工作正常。
但我不能在一个计时器内处理不同的“TimerTask”。 我尝试将TimerTask对象添加到构造函数中,但在将新的TimerTask(RemindTask1)对象作为参数(内部类的实例)传递时出现编译错误

以下是它如何处理一项任务:

public class MyTimer {
    Timer timer;

    public MyTimer(long time) {
        timer = new Timer();
        timer.schedule(new RemindTask(), time);
    }

    class RemindTask extends TimerTask {
        @Override
        public void run() {
            /// ...
            timer.cancel();
        }
    }

    public static void main(String[] args) {
        /// ...
        MyTimer myTimer = new MyTimer(5000);
        /// ...
    }
}
但我完全无法理解如何创建并运行多个任务

public class MyTimer {
    Timer timer;

    public MyTimer(TimerTask tt, long time) {
        timer = new Timer();
        timer.schedule(tt, time);
    }

    class RemindTask1 extends TimerTask {
        @Override
        public void run() {
            /// ...
            timer.cancel();
        }
    }

    class RemindTask2 extends TimerTask {
        @Override
        public void run() {
            /// ...
            timer.cancel();
        }
    }

    public static void main(String[] args) {
        /// ...
        MyTimer myTimer = new MyTimer(new RemindTask2(), 5000);
        /// ...
    }
}
但这不起作用,我也不知道出了什么问题。 当我将new rementtask2()作为参数传递时,出现编译错误。

我假设“不工作”是指编译器不允许您从静态上下文(
main
方法)创建内部类
rementtask2
的实例

通常有两种方法来处理这个问题

  • 请一个
    MyTimer
    实例为您创建其内部类实例。这实际上不是一个选项,因为在构造
    MyTimer
    之前,需要存在内部类实例
  • 通过添加
    static
    关键字,将内部类更改为嵌套类。这是你的选择

  • 与其在构造函数中完成所有工作,不如在MyTimer类中创建一个公共方法,并将任务的调度移到该方法的主体中。就像构造函数一样,方法可以接受TimerTask参数。我重新编写了你问题的一些部分,并给了你一个更具描述性的标题(搜索你问题的人会用到这个标题)。现在还不完全清楚出了什么问题,所以如果你在问题主体中添加更多关于你想做什么的信息,可能会更好。谢谢你的建议谢谢。非常简单的解决方案,效果很好。还有一个问题是如何在此处取消计时器任务,而不是计时器本身?除非您想确保任务只执行一次,否则不需要在此处取消计时器。当
    run()
    方法完成执行时,任务结束,因此不需要“取消”任务本身。此外,当
    MyTimer
    实例仅用于运行该任务时,仅取消该任务没有意义。
        MyTimer myTimer;
        // initialize myTimer
        TimerTask task = myTimer.new RemindTask2();
    
        static class RemindTask2 extends TimerTask {
            //...
        }