0

对于我正在解决的问题,我必须定期运行一系列调用。为此,我实现了 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满足条件的情况下运行这些方法,最好的方法是什么?

4

1 回答 1

1

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

public class TimerTaskA extends TimerTask
{

    public void doCoolThings()
    {
        processEvent1();
        processEvent2();
        processEvent3();
    }

    @Override
    public void run()
    {
        doCoolThings();
    }
}

在另一个班级中,当需要时:

timerTask.doCoolThings();

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

于 2012-09-11T21:38:19.037 回答