1 package com.duchong.demo.demox.hutool.threadpool; 2 3 import com.google.common.util.concurrent.ThreadFactoryBuilder; 4 5 import java.util.ArrayList; 6 import java.util.List; 7 import java.util.concurrent.LinkedBlockingQueue; 8 import java.util.concurrent.ThreadFactory; 9 import java.util.concurrent.ThreadPoolExecutor; 10 import java.util.concurrent.TimeUnit; 11 12 /** 13 * 自定義線程池 14 * @author DUCHONG 15 * @since 2019-09-04 9:54 16 **/ 17 public class DiyThreadPool { 18 19 private static int maxNum=30; 20 21 public static void main(String[] args)throws Exception { 22 //被拒絕執行的任務Runnable集合 23 List<Runnable> rejectTask=new ArrayList<>(); 24 //設置預先創建線程的名稱格式 25 ThreadFactory threadFactory = new ThreadFactoryBuilder().setNameFormat("DiyThreadPool-%s").build(); 26 ThreadPoolExecutor poolExecutor=new ThreadPoolExecutor(2,5,10, TimeUnit.SECONDS, new LinkedBlockingQueue <Runnable> (10) ,threadFactory, 27 (r,executor)->{ 28 //把拒絕的任務記錄日志,然后空閑時間解析再重新執行 29 System.out.println("當前被拒絕任務為:" + r.toString()); 30 System.out.println("當前線程池大小為:"+executor.getPoolSize()); 31 32 rejectTask.add(r); 33 } 34 ); 35 36 for (int i=1;i<=maxNum;i++){ 37 poolExecutor.execute(new Task("task---"+i)); 38 } 39 40 poolExecutor.shutdown(); 41 42 System.out.println("需要繼續執行的任務列表:"); 43 rejectTask.forEach(System.out::println); 44 } 45 46 47 /** 48 * 內部task線程類 49 */ 50 static class Task extends Thread{ 51 52 String taskName; 53 Task(String taskName){ 54 super(taskName); 55 this.taskName=taskName; 56 } 57 58 @Override 59 public void run() { 60 61 System.out.println(Thread.currentThread().getName()+"----執行任務---"+taskName); 62 } 63 } 64 }