ホームページ  >  記事  >  Java  >  SpringBoot でのスケジュールされたシングルスレッド実行の問題を解決する方法

SpringBoot でのスケジュールされたシングルスレッド実行の問題を解決する方法

WBOY
WBOY転載
2023-05-12 13:04:121721ブラウズ

問題の説明

SpringBoot でスケジュールされたタスクを使用する場合、特定のタスクの実行が大量のリソースを占有し、他のタスクの実行に失敗することが判明しました。
次のシミュレーション シナリオと同様に、test1 スケジュールされたタスクのシミュレーションの実行時間は 5 秒です。この時点で、test2 タスクの実行に同期的に影響を及ぼし、test2 タスクも 5 秒ごとに実行されます。

    @Scheduled(fixedRate = 1000)
    public void test1() throws InterruptedException {
        log.info(Thread.currentThread().getName() + " | task01 ");
        Thread.sleep(5000);
    }

    @Scheduled(fixedRate = 2000)
    public void test2() {
        log.info(Thread.currentThread().getName() + " | task02 ");
    }

SpringBoot でのスケジュールされたシングルスレッド実行の問題を解決する方法

原因分析:

関連情報を確認した結果、スケジュールされたタイミング タスクのデフォルトのスレッド数は 1 つだけであることが判明しました。スケジュール設定では、ある実行が別の実行より先に完了してしまうことが、問題の直接の原因です。

解決策:

    @Bean
    public TaskScheduler taskScheduler() {
        ThreadPoolTaskScheduler taskScheduler = new ThreadPoolTaskScheduler();
        // 设置线程数量
        taskScheduler.setPoolSize(50);
        return taskScheduler;
    }

構成を追加し、TaskScheduler スレッドの数を複数に設定します。これにより、再実行時に非同期で実行され、スケジュールされた各タスクが互いに影響を与えなくなります。

SpringBoot でのスケジュールされたシングルスレッド実行の問題を解決する方法

補足:

次の Java util パッケージに含まれる TimerTask を使用すると、スケジュールされたタスクを実行することもできます。
次のパラメータの TimerTask は、実行されるタスクです。0 は最初の実行が 0 秒遅れることを意味し、3000 は 3000 ミリ秒ごとに実行されることを意味します。

rree

以上がSpringBoot でのスケジュールされたシングルスレッド実行の問題を解決する方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事はyisu.comで複製されています。侵害がある場合は、admin@php.cn までご連絡ください。