使用 ThreadPoolExecutor 建立多執行緒工具類
import java.util.concurrent.*; import java.util.concurrent.atomic.AtomicInteger; public class ThreadPoolUtils { private ThreadPoolExecutor pool = null; static Integer num = 0; /** * 獲取CPU核數 */ private static final int CORE_POOL_SIZE = Runtime.getRuntime().availableProcessors(); private static final int MAXIMUM_POOL_SIZE = Runtime.getRuntime().availableProcessors() * 5; /** * 阻塞佇列大小 */ private static final int MAX_TASK_SIZE = Integer.MAX_VALUE; /** * IO密集執行緒池配置 * @return */ public ThreadPoolExecutor getIOInstance( ){ return getNewInstance(CORE_POOL_SIZE * 2 + 1 , MAXIMUM_POOL_SIZE,"IO",MAX_TASK_SIZE); } /** * CUP密集執行緒池配置 * @return */ public ThreadPoolExecutor getCUPInstance( ){ return getNewInstance(CORE_POOL_SIZE, MAXIMUM_POOL_SIZE,"CUP",MAX_TASK_SIZE); } /** * 獲取物件 * @param corePoolSize 核心執行緒數量 * @param poolName 執行緒池名稱 * @param maxThreadSize 最大執行緒數 * @param maxTaskSize 最大阻塞任務數 * @return */ public ThreadPoolExecutor getNewInstance(int corePoolSize,int maxThreadSize,String poolName,int maxTaskSize){ pool = createPool(corePoolSize,maxThreadSize,poolName,maxTaskSize); if(pool==null){ throw new NullPointerException(); }else{ return pool; } } /** * 建立執行緒池 * @param corePoolSize 核心執行緒數量 * @param poolName 執行緒池名稱 * @param maxThreadSize 最大執行緒數 * @param maxTaskSize 最大阻塞任務數 * @return */ private ThreadPoolExecutor createPool(int corePoolSize,int maxThreadSize,String poolName,int maxTaskSize){ return new ThreadPoolExecutor(corePoolSize,maxThreadSize,0, TimeUnit.SECONDS,new LinkedBlockingQueue<>(maxTaskSize), new CustomThreadFactory(poolName), new RejectedExecutionHandlerImpl()); } /** * 執行緒工廠 * 給執行緒命名 */ private class CustomThreadFactory implements ThreadFactory { private final String poolName; public CustomThreadFactory(String poolName){ this.poolName = poolName; } private AtomicInteger count = new AtomicInteger(0); @Override public Thread newThread(Runnable r) { Thread t = new Thread(r); String nowThreadName = ""; nowThreadName = poolName + count.addAndGet(1); t.setName(nowThreadName); return t; } } /** * 自定義拒絕策略 */ private class RejectedExecutionHandlerImpl implements RejectedExecutionHandler { @Override public void rejectedExecution(Runnable r, ThreadPoolExecutor executor) { try{ System.out.println("重回佇列"); executor.getQueue().put(r); }catch (Exception e){ } } } public static void main(String[] args){ ThreadPoolExecutor executor = new ThreadPoolUtils().getNewInstance(3,8,"test",5); for (int i = 0;i<20;i++){ System.out.println("提交第"+i+"個任務"); executor.execute(()->{ try { System.out.println(Thread.currentThread().getName()); TimeUnit.SECONDS.sleep(10); synchronized (num){ System.out.println("數字為:"+num++); } } catch (InterruptedException e) { e.printStackTrace(); } }); System.out.println("提交第"+i+"個任務成功"); } System.out.println("結束"); } }
相關文章
- java多執行緒系列:ThreadPoolExecutorJava執行緒thread
- 使用 Executors,ThreadPoolExecutor,建立執行緒池,原始碼分析理解thread執行緒原始碼
- 多執行緒(三)、執行緒池 ThreadPoolExecutor 知識點總結執行緒thread
- Java多執行緒同步工具類之SemaphoreJava執行緒
- Java多執行緒同步工具類之CountDownLatchJava執行緒CountDownLatch
- Java多執行緒同步工具類之CyclicBarrierJava執行緒
- 大話Android多執行緒(五) 執行緒池ThreadPoolExecutor詳解Android執行緒thread
- Java多執行緒-執行緒池ThreadPoolExecutor構造方法和規則Java執行緒thread構造方法
- 執行緒池ThreadPoolExecutor執行緒thread
- 多執行緒------執行緒與程式/執行緒排程/建立執行緒執行緒
- Java多執行緒Thread類使用Java執行緒thread
- 如何讓ThreadPoolExecutor更早地建立非核心執行緒thread執行緒
- MFC多執行緒的建立,包括工作執行緒和使用者介面執行緒執行緒
- 【原創】Java多執行緒初學者指南(2):用Thread類建立執行緒Java執行緒thread
- Java 執行緒池(ThreadPoolExecutor)原理分析與使用Java執行緒thread
- 多執行緒使用執行緒
- 併發工具類(一)等待多執行緒的CountDownLatch執行緒CountDownLatch
- java多執行緒與併發 - 併發工具類Java執行緒
- 多執行緒知識梳理(6) 執行緒池四部曲之 ThreadPoolExecutor執行緒thread
- 【重學Java】多執行緒進階(執行緒池、原子性、併發工具類)Java執行緒
- 【原創】Java多執行緒初學者指南(3):使用Runnable介面建立執行緒Java執行緒
- Java執行緒池之ThreadPoolExecutorJava執行緒thread
- Java多執行緒-執行緒池的使用Java執行緒
- Java併發 之 執行緒池系列 (2) 使用ThreadPoolExecutor構造執行緒池Java執行緒thread
- 多執行緒系列(十五) -常用併發工具類詳解執行緒
- 使用委託開啟多執行緒(多執行緒深入)執行緒
- 多執行緒-以前的執行緒安全的類回顧執行緒
- 多執行緒-匿名內部類的方式實現多執行緒程式執行緒
- Android執行緒管理之ThreadPoolExecutor自定義執行緒池Android執行緒thread
- JAVA重點類 多執行緒Java執行緒
- java使用多執行緒Java執行緒
- Java多執行緒學習(1)建立執行緒與執行緒的生命週期Java執行緒
- 【java】【多執行緒】建立執行緒的兩種常用方式(2)Java執行緒
- C#多執行緒之旅(2):建立和開始執行緒C#執行緒
- java多執行緒之執行緒的基本使用Java執行緒
- 多執行緒-執行緒組的概述和使用執行緒
- 多執行緒-執行緒池的概述和使用執行緒
- Java併發——執行緒池ThreadPoolExecutorJava執行緒thread