有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java调用TimerTask的run()方法

对于我正在解决的问题,我必须定期运行一系列调用。为了实现这一点,我实现了TimerTask。但是,我有时也想通知timertask,并且需要在满足某些条件时调用相同的方法,即使计时器没有过期。我的代码与此类似

//File TimerTaskA.java
public class TimerTaskA extends TimerTask
{
    @Override
    public void run()
    {
        processEvent1();
        processEvent2();
        processEvent3();
    }
}

//File ProcessEventManager.java
public class ProcessEventManager
{
    public TimerTaskA timerTask;

    public ProcessEventManager()
    {
        initTimerTask();
    }

    public void initTimerTask()
    {
        Timer timer = new Timer("TimerTaskA", true);
        timerTask == new TimerTaskA();
        timer.schedule(timerTask , 0, 10000);
    }

    public void conditionalTask()
    {
        long time = System.currentTimeMillis();
        // some condition statement. here it happens to be time in millisecs ends with 2 or 3.
        if (time%10 == 2 || time%10 == 3)
            timerTask.run();
    }
}

ProcessEventManager.conditionalTask()方法中,直接调用TimerTask的run()方法来解决这种情况是否正确?有没有更好的设计方法来解决这样的问题

processEvent方法可能是耗时的方法,我不希望运行ProcessEventManager的线程在执行这些方法时被阻塞。为了让TimerTask在计时器过期以及ProcessEventManager.conditionalTask中的条件满足的情况下运行这些方法,最好的方法是什么


共 (1) 个答案

  1. # 1 楼答案

    基本上,是的,可以按您编写的那样做,但是更清晰的方法是从TimerTask内部调用一些处理方法,当您想要执行此操作时,直接调用它,而不是通过TimerTask对象

    public class TimerTaskA extends TimerTask
    {
    
        public void doCoolThings()
        {
            processEvent1();
            processEvent2();
            processEvent3();
        }
    
        @Override
        public void run()
        {
            doCoolThings();
        }
    }
    

    在另一类中,需要时:

    timerTask.doCoolThings();
    

    在我看来,这主要是因为run的目的是充当线程(或调用方)入口点,而不是执行特定任务