目次
1: ThreadPoolTask​​Executo
1 ThreadPoolTask​​Scheduler はタスク スレッド プールを定期的にスケジュールし、非同期タスクを処理します
2 @Async は非同期タスクをオンにしますスレッド プールを指定します
ホームページ Java &#&チュートリアル Springboot 独自のスレッド プールを実装する方法

Springboot 独自のスレッド プールを実装する方法

Jun 28, 2023 pm 04:33 PM
スレッドプール

1: ThreadPoolTask​​Executo

1 ThreadPoolTask​​Executor スレッド プール:

ThreadPoolTask​​Executor は、Java 独自のスレッド プール ThreadPoolExecutor に基づく Spring の二次カプセル化です。主な目的は、Spring フレームワーク システムでより便利にすることです。スレッド プールは Spring で使用されます。これは Spring のデフォルトのスレッド プールです。

2 ThreadPoolTask​​Executor を使用して、ioc
構成ファイル フォームに Bean を注入します。Spring は自動的に

## 默认线程池配置,ThreadPoolTaskExecutor 
# 核心线程数
spring.task.execution.pool.core-size=8  
# 最大线程数
spring.task.execution.pool.max-size=16
# 空闲线程存活时间
spring.task.execution.pool.keep-alive=60s
# 是否允许核心线程超时
spring.task.execution.pool.allow-core-thread-timeout=true
# 线程队列数量
spring.task.execution.pool.queue-capacity=100
# 线程关闭等待
spring.task.execution.shutdown.await-termination=false
spring.task.execution.shutdown.await-termination-period=
# 线程名称前缀
spring.task.execution.thread-name-prefix=demo_Thread
ログイン後にコピー

Configuration フォームを構成します。 :

import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor;
import org.springframework.scheduling.concurrent.ThreadPoolTaskScheduler;
import java.util.concurrent.ConcurrentHashMap;
import java.util.concurrent.ConcurrentMap;
import java.util.concurrent.Executor;
import java.util.concurrent.ScheduledFuture;
//@Configuration
public class ThreadConfig {
    @Value("${task.maxPoolSize}")
    private int maxPoolSize;
    //todo 其他的相关配置都可以通过配置文件中注入
    @Bean("ThreadPoolTaskExecutor")
    public Executor myAsync() {
        final ThreadPoolTaskExecutor executor =
                new ThreadPoolTaskExecutor();
        executor.setMaxPoolSize(maxPoolSize);
        //todo  其他参数设置
        //初始化
        executor.initialize();
        return executor;
    }
}
ログイン後にコピー

3 スレッド作成後、ioc

4 からすべてのスレッド プールを取得します。 スレッド プール処理プロセス:

(1) コア スレッド プールがいっぱいかどうかを確認します。そうでない場合は、タスクを実行するためのスレッドを作成し、コアスレッド数がいっぱいの場合は、タスクキューがいっぱいかどうかを確認し、そうでない場合は、タスクキューにスレッドを格納します。タスクキューがいっぱいの場合は、最大スレッド数を確認します。そうでない場合は、タスクを実行するスレッドを作成します。スレッドがいっぱいの場合は、拒否ポリシーに従って実行します

(2) 拒否ポリシー:

  • CallerRunsPolicy() : 元のスレッドが実行します

  • AbortPolicy(): 例外を直接スローします

  • DiscardPolicy(): 直接破棄します

  • DiscardOldestPolicy(): キュー内の最も古いアイテムを破棄します

  • ##2: ThreadPoolTask​​Scheduler

1 ThreadPoolTask​​Scheduler はタスク スレッド プールを定期的にスケジュールし、非同期タスクを処理します

2 使用方法: ThreadPoolTask​​Scheduler の Bean を注入します

# (1) 設定ファイルの形式: ..

(2) 設定クラスの形式:

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.scheduling.concurrent.ThreadPoolTaskScheduler;
import java.util.concurrent.ConcurrentHashMap;
import java.util.concurrent.ConcurrentMap;
import java.util.concurrent.ScheduledFuture;
@Configuration
public class ThreadPoolTaskSchedulerConfig {
    @Bean
    public ThreadPoolTaskScheduler threadPoolTaskScheduler() {
        final ThreadPoolTaskScheduler threadPoolTaskScheduler = new ThreadPoolTaskScheduler();
        //设置等待任务在关机时l候完成
        threadPoolTaskScheduler.setWaitForTasksToCompleteOnShutdown(true);
        //设置等待时间为60s
        threadPoolTaskScheduler.setAwaitTerminationSeconds(60);
        return threadPoolTaskScheduler;
    }
}
ログイン後にコピー

3 ThreadPoolTask​​Scheduler のスケジュールされたタスクを使用します

通常のスレッド プールに使用:

submit( callable)、実行結果が必要です
  • submit(runnable)、実行結果は必要ありません
  • (1) スケジュールされたタスク
タスクの内容 Runnable を追加し、実行期間のトリガー/日付を設定します。トリガー式は Baidu を使用できます。

 schedule(Runnable task,Trigger)
 schedule(Runnable task,Date)
ログイン後にコピー

(2) タスクを実行する間隔を指定します。前のタスクの完了から次のタスクの開始までの時間間隔をミリ秒単位で指定します。

 scheduleWithFixedDelay(Runnable task,long delay)
ログイン後にコピー

(3) 実行タスクを一定の頻度で実行し、タスクの開始後一定間隔で新しいタスクを実行します。最後のタスクが完了した場合は、最後のタスクが完了するのを待ってから次のタスクを実行します。

 scheduleAtFixedRate(Runnable task,long delay)
ログイン後にコピー

(4) スケジュールされたタスクのキャンセル:

スケジュールされたタスクが保存されるコレクションを設定します。スケジュールされたタスクの実行の結果は、ScheduledFuture です。オブジェクトをコレクションに格納し、コレクション内の ScheduledFuture< を取得します。?>オブジェクト。 cancel(true) スケジュールされたタスクをキャンセルします

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.scheduling.concurrent.ThreadPoolTaskScheduler;
import org.springframework.scheduling.support.CronTrigger;
import org.springframework.stereotype.Service;
import java.text.DateFormat;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.concurrent.*;
@Service
public class SchedulerService {
    @Autowired
    ThreadPoolTaskScheduler scheduler;
    /**
     * 常规线程池使用
     */
    public void tesScheduler1() throws ExecutionException, InterruptedException {
        //无返回值
        final Future<?> demo_scheduler1 = scheduler.submit(new Runnable() {
            @Override
            public void run() {
                System.out.println("demo runnable scheduler");
            }
        });
        //无返回值
        final Future<?> demo_scheduler2 = scheduler.submit(new Callable<Object>() {
            @Override
            public Object call() throws Exception {
                System.out.println("demo callable  scheduler");
                return "callable";
            }
        });
        System.out.println("result:" + demo_scheduler2.get());
    }
    /**
     * 定时任务
     */
    public void tesScheduler2() throws ParseException {
        //CronTrigger表达式百度即可
        scheduler.schedule(() -> {
            System.out.println("定时任务");
        }, new CronTrigger("0/1****?"));
        //创建指定时间的日期
        final Date date = new Date(2023, 3, 26, 21, 35);
        final DateFormat format = new SimpleDateFormat();
        final Date parse = format.parse("2023-03-26-21-26");
        scheduler.schedule(() -> {
            System.out.println(new Date());
        }, parse);
    }
    /**
     * 指定时间间隔执行任务,上次任务结束到下次任务开始的时间间隔
     */
    public void tesScheduler3() {
        scheduler.scheduleWithFixedDelay(() -> {
            //todo
        }, 300L);
    }
    /**
     * 固定频率执行任务,在固定一段时间后便会执行下次任务,
     * 如果时间到了上次任务还没执行完毕则等待,
     * 直到上一次任务执行完毕后立马执行下次任务
     */
    public void tesScheduler4() {
        scheduler.scheduleAtFixedRate(new FutureTask<String>(new Callable<String>() {
                    @Override
                    public String call() throws Exception {
                        return null;
                    }
                }),
                200);
    }
    //取消定时任务队列
    public static ConcurrentMap<String, ScheduledFuture> map = new ConcurrentHashMap<>();
    public void startTask(String k1) {
        map.compute(k1, (k, v) -> {
            if (map.containsKey(k)) return v;
            map.put(k, v);
            return v;
        });
    }
}
ログイン後にコピー

Three @Scheduled はスケジュールされたタスクを実装し、アノテーションによりスケジュールされたタスクが有効になります

1 @EnableScheduled を使用してサポートを有効にします

2 @ Scheduledアノテーションメソッド

(1)@Scheduled(fixedDelay=5000) 遅延実行、5秒後に実行

(2)@Scheduled(fixedRate=5000) スケジュールされた実行、5秒ごとに実行

(3) @Scheduled(corn="002**?") カスタム実行、コーン式 Baidu、この実行方法は一般的に使用され、corn="002**?" は毎日午前 2 時にスケジュールされたタスクの実行を開始します


3 @Scheduled によって開始されたタスクはシングルスレッドであり、ブロックされやすいことに注意してください。

(1) ThreadPoolTask​​Scheduler を ioc に挿入すると、Scheduled は ThreadPoolTask​​Scheduler スレッド プールを使用します。これにより、シングルスレッドの問題を解決できます。スレッド ブロックの問題

( 2) @Scheduled アノテーションと @Async アノテーションによりスケジュールされたタスクが有効になり、@Async("pool") でスレッド プールを指定します。スレッド プールが指定されていない場合は、Spring の SimpleAsyncTaskExecutor スレッド プールが使用されます。プールはタスクを実行するたびにスレッドを追加します。効率が低くなります。

4: Spring の非同期タスク

1 @EnableAsync は非同期サポートをオンにします

2 @Async は非同期タスクをオンにしますスレッド プールを指定します

注:@ Scheduled アノテーションと @Async アノテーションによりスケジュールされたタスクが有効になり、@Async("pool") でスレッド プールを指定します。スレッド プールが指定されていない場合、Spring の SimpleAsyncTaskExecutor スレッド プールが使用されます。このスレッド プールは、タスクを実行するたびにスレッドを追加するため、非効率的ですが、@Async が単独で非同期タスクを開始する場合は、デフォルトのスレッド プールが使用されます。必要に応じてスレッド プールをカスタマイズすることをお勧めします。 .

注: @Async の戻り値は void または Future のみであり、呼び出し元と @Async をクラス内で使用することはできません。そうでない場合、AOP は使用されません。

import org.springframework.scheduling.annotation.Async;
import org.springframework.stereotype.Service;
@Service
public class AsyncService {
    @Async
    public void showThreadName1() {
        //默认线程池
        System.out.println(Thread.currentThread().getName());
    }
    @Async("myPool")//指定线程池
    public void showThreadName2() {
        System.out.println(Thread.currentThread().getName());
    }
}
ログイン後にコピー

5: 現在カスタム Java スレッド プール:

 @Bean("myPool")
    public Executor executor(){
       return new ThreadPoolExecutor(// 自定义一个线程池
                1, // coreSize
                2, // maxSize
                60, // 60s
                TimeUnit.SECONDS, new ArrayBlockingQueue<>(3) // 有界队列,容量是3个
                , Executors.defaultThreadFactory()
                , new ThreadPoolExecutor.AbortPolicy());
    }
ログイン後にコピー
Java 独自のスレッド プール、キャッシュ、固定数、単一スレッド、時間指定、、、、6 または 7 種類、続き

以上がSpringboot 独自のスレッド プールを実装する方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。

ホットAIツール

Undresser.AI Undress

Undresser.AI Undress

リアルなヌード写真を作成する AI 搭載アプリ

AI Clothes Remover

AI Clothes Remover

写真から衣服を削除するオンライン AI ツール。

Undress AI Tool

Undress AI Tool

脱衣画像を無料で

Clothoff.io

Clothoff.io

AI衣類リムーバー

AI Hentai Generator

AI Hentai Generator

AIヘンタイを無料で生成します。

ホットツール

メモ帳++7.3.1

メモ帳++7.3.1

使いやすく無料のコードエディター

SublimeText3 中国語版

SublimeText3 中国語版

中国語版、とても使いやすい

ゼンドスタジオ 13.0.1

ゼンドスタジオ 13.0.1

強力な PHP 統合開発環境

ドリームウィーバー CS6

ドリームウィーバー CS6

ビジュアル Web 開発ツール

SublimeText3 Mac版

SublimeText3 Mac版

神レベルのコード編集ソフト(SublimeText3)

Pythonで観光スポット情報や口コミを取得し、ワードクラウドやデータ可視化を作成 Pythonで観光スポット情報や口コミを取得し、ワードクラウドやデータ可視化を作成 Apr 11, 2023 pm 08:49 PM

皆さんこんにちは、Zhanshuさんです!よく言われるように、遠くから友達ができたら素晴らしいと思いませんか?友達が遊びに来てくれるのはとても嬉しいことなので、私たちも大家になって友達を遊びに連れて行ってあげられるように頑張らなければなりません!そこで問題は、いつ、どこに行くのが最適で、最も楽しい場所はどこなのかということです。今日は、スレッド プールを使用してアトラクション情報をクロールし、同じ旅行のデータをレビューし、ワード クラウドとデータを視覚化する方法を段階的に説明します。 ! !さまざまな都市の観光スポット情報をお知らせします。データのクロールを開始する前に、まずスレッドについて理解しましょう。スレッド プロセス: プロセスは、データ コレクションに対するコードの実行アクティビティであり、システム内のリソース割り当てとスケジューリングの基本単位です。スレッド: 軽量プロセス、プログラム実行の最小単位、およびプロセスの実行パスです。 1つ

Linux システムにおける一般的なサーバー負荷の問題とその解決策 Linux システムにおける一般的なサーバー負荷の問題とその解決策 Jun 18, 2023 am 09:22 AM

Linux は、サーバー システムで広く使用されている優れたオペレーティング システムです。 Linux システムを使用するプロセスでは、サーバー負荷の問題がよく発生します。サーバー負荷とは、サーバーのシステム リソースが現在の要求を満たすことができず、システム負荷が高くなりすぎて、サーバーのパフォーマンスに影響を与えることを意味します。この記事では、Linux システムにおける一般的なサーバー負荷の問題とその解決策を紹介します。 1. CPU 負荷が高すぎる サーバーの CPU 負荷が高すぎると、システムの応答が遅くなったり、リクエストの処理時間が長くなるなどの問題が発生します。 Cの場合

Java 7 でスレッド プールを使用してタスクの循環スケジュールを実装する方法 Java 7 でスレッド プールを使用してタスクの循環スケジュールを実装する方法 Jul 29, 2023 pm 10:37 PM

スレッド プールを使用して Java7 でタスクの循環スケジューリングを実装する方法 はじめに: Java アプリケーションを開発する場合、スレッド プールを使用すると、タスクの実行効率とリソース使用率を向上させることができます。 Java7 では、スレッド プールを使用してタスクの循環スケジューリングを簡単に実装できます。この記事では、スレッド プールを使用して Java7 でタスクの循環スケジューリングを実装する方法を紹介し、対応するコード例を添付します。 1. 概要: スレッド プールは、固定数のスレッドを再利用して頻繁な作成やスレッドの作成を回避できるマルチスレッド処理構造です。

Java 7 でスレッド プールを使用してタスクの優先順位スケジューリングを実装する方法 Java 7 でスレッド プールを使用してタスクの優先順位スケジューリングを実装する方法 Jul 30, 2023 pm 06:38 PM

スレッド プールを使用して Java7 でタスク優先度スケジューリングを実装する方法 並行プログラミングでは、タスク優先度スケジューリングは一般的な要件です。 Java は、タスクを簡単に管理およびスケジュールできるようにするスレッド プール メカニズムを提供します。この記事では、スレッドプールを使用してJava7でタスク優先度スケジューリングを実装する方法を紹介します。まず、Java7 のスレッド プールの基本概念と使用法を理解する必要があります。スレッド プールは、複数のタスクを実行するスレッドのグループを管理およびスケジュールするスレッド再利用メカニズムです。 Java についての言及

マイクロサービス アーキテクチャでサービス スレッド プールとタスク スケジューリングを処理するにはどうすればよいですか? マイクロサービス アーキテクチャでサービス スレッド プールとタスク スケジューリングを処理するにはどうすればよいですか? May 17, 2023 am 08:36 AM

エンタープライズ レベルのアプリケーションでマイクロサービス アーキテクチャが広く適用されるようになったことで、マイクロサービスのパフォーマンスと安定性を最適化する方法が注目されています。マイクロサービスでは、マイクロサービスが数千のリクエストを処理する場合があり、サービスのスレッド プールとタスク スケジューリングも、マイクロサービスのパフォーマンスと安定性の重要な要素です。この記事では、マイクロサービス アーキテクチャにおけるスレッド プールとタスク スケジューリング、およびマイクロサービスにおけるスレッド プールとタスク スケジューリングのパフォーマンスを最適化する方法を紹介します。 1. マイクロサービス アーキテクチャのスレッド プール マイクロサービス アーキテクチャでは、マイクロサービスによって処理される各リクエストはスレッド プールを占有します。

Java で ExecutorCompletionService 関数を使用してスレッド プール タスクのスケジュールを設定する方法 Java で ExecutorCompletionService 関数を使用してスレッド プール タスクのスケジュールを設定する方法 Jun 26, 2023 pm 02:49 PM

インターネット技術の発展に伴い、マルチスレッド プログラミングの重要性がますます高まっています。同時実行性の高いプログラムを作成する場合、マルチスレッド技術を最大限に活用すると、プログラムの実行効率が大幅に向上します。ただし、マルチスレッドプログラミング自体には、スレッド間の通信や同期連携など、多くの課題が伴います。これらの問題を解決するために、Java は多くのスレッド プール フレームワークを提供しており、ExecutorCompletionService もその 1 つです。この記事ではExecutorCompletionServiについて紹介します。

Spring スレッド プールはどこに設定されていますか? Spring スレッド プールはどこに設定されていますか? Jan 19, 2024 pm 04:55 PM

Spring スレッド プールを構成する方法: 1. ThreadPoolTask​​Executor Bean を使用する; 2. SimpleAsyncTaskExecutor を使用する; 3. XML で TaskExecutor Bean を使用する; 4. サードパーティ ライブラリを使用する; 5. 実装をカスタマイズする; 6. システム プロパティまたは環境変数を通じて構成する; 7. 統合とコンテナ; 8. プログラムによる構成; 9. サードパーティのフレームワークを使用した統合; 10. ハイブリッド構成; 11. リソースの制限と制約などを考慮する

Springboot 独自のスレッド プールを実装する方法 Springboot 独自のスレッド プールを実装する方法 Jun 28, 2023 pm 04:33 PM

1: ThreadPoolTask​​Executo1 ThreadPoolTask​​Executor スレッド プール: ThreadPoolTask​​Executor は、Java 独自のスレッド プール ThreadPoolExecutor に基づいた Spring の二次カプセル化です。主な目的は、Spring フレームワーク システムでスレッド プールをより便利に使用できるようにすることです。Spring 2 のデフォルトのスレッド プールです。 ThreadPoolTask​​Executor を使用して Bean を注入します。ioc の構成ファイル フォームに移動します。Spring は自動的に ##Default スレッド プール構成、ThreadPoolTask​​Executor#Core を構成します。

See all articles