java -- ユニバーサル スレッド プール

背景:

        最近、仕事でスレッド プールを使用することがあったので、一般的なスレッド プール ツール クラスを作成しました。後でスレッド プールを直接再利用するために使用する必要があります。

コード:

        

import lombok.extern.slf4j.Slf4j;
import java.util.concurrent.*;
/**
*   通用线程池
* */
@Slf4j
public class PushThreadPoolUtils {
    public static volatile ThreadPoolExecutor pool=null;


    private final static int CORE_POOL_SIZE =10 ;//核心线程数
    private final static int MAXIMUM_POOL_SIZE =50 ;//最大线程数
    private final static long KEEP_ALIVE_TIME =5 ;//非核心线程空闲时间
    private final static int MAXIMUM_WORK_QUEUE = 400;//消息队列最大任务数

    private PushThreadPoolUtils(){
        pool=new ThreadPoolExecutor(CORE_POOL_SIZE,// 1. 核心线程数
                MAXIMUM_POOL_SIZE,// 2. 最大线程数
                KEEP_ALIVE_TIME, // 3. 非核心线程空闲时间
                TimeUnit.SECONDS, // 4. 时间单位
                new ArrayBlockingQueue<>(MAXIMUM_WORK_QUEUE),// 5. 阻塞队列
                Executors.defaultThreadFactory(),// 6. 创建线程工厂
                new ThreadPoolExecutor.AbortPolicy());// 7. 拒绝策略
        log.info("PushThreadPoolUtils 线程池创建完成");
    }

    public static ThreadPoolExecutor getInstance(){
        //双重if单例
        if (null == pool){
            synchronized (PushThreadPoolUtils.class){
                if (pool == null){
                    new PushThreadPoolUtils();
                    return pool;
                }
            }
        }
        return pool;
    }

    // 无响应执行
    public static void execute(Runnable runnable){
        getInstance().execute(runnable);
    }

    // 有响应执行
    public static<T> Future<T> submit(Callable<T> callable){
        return getInstance().submit(callable);
    }

}

テスト:

        main メソッドはコードをテストし、20 個の Runnable を作成し、実際のビジネス タスクをシミュレートして、実行のためにスレッド プールにそれらを置きます。

    public static void main(String[] args) {
        System.out.println("测试执行20个任务");
        for (int i=0; i<20; i++){
            String aa = "执行任务:" + (i+1);
            PushThreadPoolUtils.execute( new Runnable() {
                public void run(){
                    System.out.println(aa);
                }
            });
        }
    }

試験結果:

        スレッド プールはスレッド タスクを正常に作成して実行しますが、タスクの実行順序も狂っていることがわかります。これは、タスクを実行するためにスレッドが作成されると、複数の準備完了スレッドが CPU をめぐって競合するためです。これは、スレッド プールを使用すると、シリアル処理が並列処理に変わることを証明します。

测试执行20个任务
14:59:28.188 [main] INFO  c.r.q.u.PushThreadPoolUtils - [<init>,28] - PushThreadPoolUtils 线程池创建完成
执行任务:2
执行任务:1
执行任务:4
执行任务:3
执行任务:5
执行任务:6
执行任务:7
执行任务:8
执行任务:11
执行任务:9
执行任务:12
执行任务:13
执行任务:14
执行任务:15
执行任务:17
执行任务:18
执行任务:19
执行任务:20
执行任务:10
执行任务:16

        スレッド プールのブロッキング キュー、スレッド ファクトリ、および過負荷後の拒否ポリシーはすべてオプションであり、独自のビジネス条件に応じてさまざまな選択を行うことができます。

おすすめ

転載: blog.csdn.net/DGH2430284817/article/details/130222224