1

最後に、試行錯誤の末、思い通りに動作させることができました。

しかし、コードをより読みやすくシンプルにするためのアドバイスをお願いします。必要なものをアーカイブするために多くの不要なコードが作成されたようです。

これが基本的に行うことは、スケジュール タスクを実行する必要があるときにサーバー アプリをオンにすると、タスクが開始され、開始されるべき時間からの残りの時間だけ実行されます。それ以外の場合は、実行がスケジュールされます実行することになっている時間。

したがって、スケジュール時刻が 13:00:00 で、120 分間実行する必要がある場合、アプリを 13:30 に開始すると、アプリは 90 分間実行されます。それ以降に開始した場合、通常は翌日の13:00:00にスケジュールされます。

        Calendar calendar = Calendar.getInstance();
        calendar.set(Calendar.HOUR_OF_DAY, hour);
        calendar.set(Calendar.MINUTE, 0);
        calendar.set(Calendar.SECOND, 0);

        long start_time = calendar.getTimeInMillis() - System.currentTimeMillis();

        if (start_time < 0)
        {
            long minutes = (start_time*-1) / (60 * 1000);
            if (minutes > 0 && minutes < 120)
            {
                runTimeLeft = 120 - minutes;
                ThreadPoolManager.getInstance().schedule(new Runnable()
                {
                    public void run()
                    {
                        myTask();
                    }
                }, 0);
            }
            else
                runTimeLeft = 0;

            Calendar calendar = Calendar.getInstance();
            calendar.set(Calendar.HOUR_OF_DAY, hour+24);
            calendar.set(Calendar.MINUTE, 0);
            calendar.set(Calendar.SECOND, 0);

            start_time = calendar.getTimeInMillis() - System.currentTimeMillis();
        }

        ThreadPoolManager.getInstance().scheduleAtFixedRate(new Runnable()
        {
            public void run()
            {
                myTask();
            }
        }, start_time, 24 * 60 * 60 * 1000);

ここで私の質問は、上記のコードで何を改善できるかということです。

4

2 に答える 2

0

java.util.Timer単体で使うのではなく、一緒に使ってみてくださいTimerTask。これに関する IBM の優れた記事があります。

このリンクを見てください: http://www.ibm.com/developerworks/java/library/j-schedule.html

コードも共有されており、些細な日常業務で機能するようです。

于 2011-02-24T02:59:07.657 に答える
0

最初の方法では代わりにこれを使用します。

int interval = 24 * 60 * 60 * 1000; // might be long instead of int
ThreadPoolManager.getInstance().scheduleAtFixedRate(new Runnable()
{
    public void run()
    {
        myTask();
    }
}, interval, interval);

これにより、24 時間後に呼び出される単純なタイマーが作成さmyTask()れ、その後は 24 時間ごとに呼び出されます。

ただし、他の要件は少し異なります。私があなたの説明を正しく理解していれば、アプリが起動して実行されている場合、基本的に午前 12 時に何らかのタスクを実行する必要があります。これについてミリ秒単位の精度を気にしない場合は、タイマーを 1 分間で開始し、各ティックで現在のシステム時間をチェックすることで非常に簡単に達成できます。毎日のタスクを実行します。

より洗練された方法には、事前にスケジュールされた時間にアプリケーションへのコールバックを行うように OS と対話することが含まれます (必要に応じてアプリを起動することもできます) が、この種のことは OS/プラットフォーム固有です (指定しませんでした)。 .

更新: 私は Linux について何も知りませんがcron、あなたが探しているのは仕事のようです。この質問を参照してください:

LinuxサーバーでJavaで書かれたスケジュールされたタスクを実行する

于 2011-02-24T03:01:47.697 に答える