0

私が解決している問題については、定期的に一連の呼び出しを実行する必要があります。これを実現するために、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 に答える