值得注意的是儘量不要用,這種默認形式創建 線程池,結合自己的業務場景去做。Executors.newFixedThreadPool() 比如默認的創建 隊列會讓默認這種 無界限LinkedBlockingQueue隊列,可以自動擴容,但是遇到高併發的場景,擴容是非常慢的。非常 浪費時間, import java.util.concurrent.*; import java.util.concurrent.atomic.AtomicInteger; public static void main(String[] args) throws InterruptedException { /** * public ThreadPoolExecutor(int corePoolSize, * int maximumPoolSize, * long keepAliveTime, * TimeUnit unit, * BlockingQueue<Runnable> workQueue, * ThreadFactory threadFactory, * RejectExecutionHandler handler * ) { * this(corePoolSize, maximumPoolSize, keepAliveTime, unit, workQueue, * threadFactory, handler); * * corePoolSize:表示線程池最小線程數量,舉個例子,老闆花錢僱你閒,活少的時候, * 不能把人都清走,要留點最少的人。 * maximumPoolSize:線程池最大的線程數量,當活很多的時候,最多加到maximumPoolSize人就不加了。 * keepAliveTime:如何判斷活的忙還是閒着,某個線程在那裏一段時間的空閒度,比如一個線程空閒了 * keepAliveTime秒 就表示閒了,且線程數大於corePoolSize 才生效,回收線程。 * unit:時間單位的設置 * workQueue:選擇不同的隊列,這個簡單具體查一下就可以:建議高併發下指定有界限的ArrayBlockingQueue * 因爲高併發下擴容非常耗時。 * threadFactory:自定義線程名稱 * handler:自定義拒絕策略,如果線程池中所有的線程都在忙碌,且隊列也滿了,就會執行拒絕策略 * 有四種可以選擇:CallerRunsPolicy :提交任務的線程自己去執行該任務 * AbortPolicy:默認的拒絕策略,會 throws RejectExecutionException. * DiscardPolicy:直接丟棄任務,沒有任何異常拋出。 * DiscardOldestPolicy:丟棄最老的任務,其實就是把最早進入工作隊列的任務丟棄,然後 * 把新任務加入到工作隊列。 * * * */ ThreadPoolExecutor threadPoolExecutor = new ThreadPoolExecutor(2, 5, 6, TimeUnit.SECONDS, new ArrayBlockingQueue<Runnable>(8) , new JxdThreadFactory("定義你自己的線程池"), new ThreadPoolExecutor.AbortPolicy() ); Thread thread = new Thread(() -> { System.out.println("執行任務》》》" + Thread.currentThread().getName()); }); threadPoolExecutor.execute(thread); } /** * 定義內部類的方式,定義線程名稱 */ private static class JxdThreadFactory implements ThreadFactory { private static final AtomicInteger poolNumber = new AtomicInteger(1); private final ThreadGroup group; private final AtomicInteger threadNumber = new AtomicInteger(1); private final String namePrefix; public JxdThreadFactory() { SecurityManager s = System.getSecurityManager(); group = (s != null) ? s.getThreadGroup() : Thread.currentThread().getThreadGroup(); namePrefix = "pool-" + poolNumber.getAndIncrement() + "-thread-"; } public JxdThreadFactory(String ThreadFactoryName) { SecurityManager s = System.getSecurityManager(); group = (s != null) ? s.getThreadGroup() : Thread.currentThread().getThreadGroup(); namePrefix = ThreadFactoryName + "-" + poolNumber.getAndIncrement() + "-thread-"; } @Override public Thread newThread(Runnable r) { Thread t = new Thread(group, r, namePrefix + threadNumber.getAndIncrement(), 0); if (t.isDaemon()) t.setDaemon(false); if (t.getPriority() != Thread.NORM_PRIORITY) t.setPriority(Thread.NORM_PRIORITY); return t; } }
ThreadPoolExecutor詳細使用
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.