From c5bdf339674f5762125b25104d7269b1b50e4d91 Mon Sep 17 00:00:00 2001 From: Administrator <hbal> Date: 星期五, 14 四月 2023 08:38:00 +0800 Subject: [PATCH] 连接池 --- JavaSource/com/mandi/fendan/util/ThreadPoolUtil.java | 121 ++++++++++++++++++++++++++++++++++++++++ 1 files changed, 121 insertions(+), 0 deletions(-) diff --git a/JavaSource/com/mandi/fendan/util/ThreadPoolUtil.java b/JavaSource/com/mandi/fendan/util/ThreadPoolUtil.java new file mode 100644 index 0000000..43f01ff --- /dev/null +++ b/JavaSource/com/mandi/fendan/util/ThreadPoolUtil.java @@ -0,0 +1,121 @@ +package com.mandi.fendan.util; + +import javax.validation.constraints.NotNull; +import java.util.concurrent.LinkedBlockingQueue; +import java.util.concurrent.ThreadFactory; +import java.util.concurrent.ThreadPoolExecutor; +import java.util.concurrent.TimeUnit; +import java.util.concurrent.atomic.AtomicInteger; + +/** + * 绾跨▼姹犵殑宸ュ叿绫� + * 鐢ㄤ簬杩涜绾跨▼鐨勭鐞嗭紝闃叉閲嶅鍒涘缓銆佹潃姝荤嚎绋嬨�� + * + + * 澶氱嚎绋嬭繍琛屾湡闂达紝濡傛灉绯荤粺涓嶆柇鐨勫垱寤恒�佹潃姝绘柊绾跨▼锛� + * 浼氫骇鐢熻繃搴︽秷鑰楃郴缁熻祫婧愶紝浠ュ強杩囧害鍒囨崲绾跨▼鐨勯棶棰橈紝鐢氳嚦鍙兘瀵艰嚧绯荤粺璧勬簮鐨勫穿婧冦�� + * 鍥犳闇�瑕佺嚎绋嬫睜锛屽绾跨▼杩涜绠$悊銆� + */ +public class ThreadPoolUtil { + + private String TAG = getClass().getName(); + private static volatile ThreadPoolUtil mInstance; + //鏍稿績绾跨▼姹犵殑鏁伴噺锛屽悓鏃惰兘澶熸墽琛岀殑绾跨▼鏁伴噺 + private int corePoolSize; + //鏈�澶х嚎绋嬫睜鏁伴噺锛岃〃绀哄綋缂撳啿闃熷垪婊$殑鏃跺�欒兘缁х画瀹圭撼鐨勭瓑寰呬换鍔$殑鏁伴噺 + private int maxPoolSize; + //瀛樻椿鏃堕棿 + private long keepAliveTime = 1; + private TimeUnit unit = TimeUnit.HOURS; + private ThreadPoolExecutor executor; + + private ThreadPoolUtil() { + //缁檆orePoolSize璧嬪�硷細褰撳墠璁惧鍙敤澶勭悊鍣ㄦ牳蹇冩暟*2 + 1,鑳藉璁ヽpu鐨勬晥鐜囧緱鍒版渶澶х▼搴︽墽琛岋紙鏈夌爺绌惰璇佺殑锛� + corePoolSize = Runtime.getRuntime().availableProcessors() * 2 + 1; + maxPoolSize = corePoolSize; + executor = new ThreadPoolExecutor( + //褰撴煇涓牳蹇冧换鍔℃墽琛屽畬姣曪紝浼氫緷娆′粠缂撳啿闃熷垪涓彇鍑虹瓑寰呬换鍔� + corePoolSize, + // 鐒跺悗new LinkedBlockingQueue(),鐒跺悗maximumPoolSize,浣嗘槸瀹冪殑鏁伴噺鏄寘鍚簡corePoolSize鐨� + maxPoolSize, + //琛ㄧず鐨勬槸maximumPoolSize褰撲腑绛夊緟浠诲姟鐨勫瓨娲绘椂闂� + keepAliveTime, + unit, + //缂撳啿闃熷垪锛岀敤浜庡瓨鏀剧瓑寰呬换鍔★紝Linked鐨勫厛杩涘厛鍑� + new LinkedBlockingQueue(), + new DefaultThreadFactory(Thread.NORM_PRIORITY, "thread-pool-"), + new ThreadPoolExecutor.AbortPolicy() + ); + } + + public static ThreadPoolUtil getInstance() { + if (mInstance == null) { + synchronized (ThreadPoolUtil.class) { + if (mInstance == null) { + mInstance = new ThreadPoolUtil(); + } + } + } + return mInstance; + } + + /** + * 鎵ц浠诲姟 + * + * @param runnable + */ + public void execute(Runnable runnable) { + if (executor == null) { + executor = new ThreadPoolExecutor( + corePoolSize, + maxPoolSize, + keepAliveTime, + TimeUnit.SECONDS, + new LinkedBlockingQueue(), + new DefaultThreadFactory(Thread.NORM_PRIORITY, "thread-pool-"), + new ThreadPoolExecutor.AbortPolicy()); + } + if (runnable != null) { + executor.execute(runnable); + } + } + + /** + * 绉婚櫎浠诲姟 + * + * @param runnable + */ + public void remove(Runnable runnable) { + if (runnable != null) { + executor.remove(runnable); + } + } + + private static class DefaultThreadFactory implements ThreadFactory { + //绾跨▼姹犵殑璁℃暟 + private static final AtomicInteger poolNumber = new AtomicInteger(1); + //绾跨▼鐨勮鏁� + private final AtomicInteger threadNumber = new AtomicInteger(1); + private final ThreadGroup group; + private final String namePrefix; + private final int threadPriority; + + DefaultThreadFactory(int threadPriority, String threadNamePrefix) { + this.threadPriority = threadPriority; + this.group = Thread.currentThread().getThreadGroup(); + this.namePrefix = threadNamePrefix + poolNumber.getAndIncrement() + "-thread-"; + } + + @Override + public Thread newThread(@NotNull Runnable r) { + Thread thread = new Thread(group, r, namePrefix + threadNumber.getAndIncrement(), 0); + // 杩斿洖True璇ョ嚎绋嬪氨鏄畧鎶ょ嚎绋� + // 瀹堟姢绾跨▼搴旇姘歌繙涓嶅幓璁块棶鍥烘湁璧勬簮锛屽锛氭暟鎹簱銆佹枃浠剁瓑銆傚洜涓哄畠浼氬湪浠讳綍鏃跺�欑敋鑷冲湪涓�涓搷浣滅殑涓棿鍙戠敓涓柇銆� + if (thread.isDaemon()) { + thread.setDaemon(false); + } + thread.setPriority(threadPriority); + return thread; + } + } +} -- Gitblit v1.9.3