import java.util.concurrent.ThreadFactory; import java.util.concurrent.atomic.AtomicInteger; import java.util.concurrent.atomic.AtomicLong; /** * @Description: * @author: fdy * @date: 2020/2/14 11:39 */ public class UserThreadFactory implements ThreadFactory { private final String namePrefix; private final AtomicInteger nextId = new AtomicInteger(1); public UserThreadFactory(String namePrefix) { // 设置线程的名称 this.namePrefix = "设置线程的名称: UserThreadFactory's "+ namePrefix+"-Worker-"; } @Override public Thread newThread(Runnable task) { String name = namePrefix + nextId.getAndIncrement(); Thread thread = new Thread(null, task, name, 0); System.out.println(thread.getName()); return thread; } } // 任务执行体 class Task implements Runnable{ private final AtomicLong count = new AtomicLong(0L); @Override public void run() { System.out.println("running_"+count.getAndIncrement()); } } /** * @Description:测试类 * @author: fdy * @date: 2020/2/14 12:10 */ public class UserRejectHandler implements RejectedExecutionHandler { @Override public void rejectedExecution(Runnable task, ThreadPoolExecutor executor) { System.out.println("来之任务拒绝类的异常打印信息task rejected. "+ executor.toString()); } } /** * @Description: * @author: fdy * @date: 2020/2/14 12:13 */ public class UserThreadPool { public static void main(String[] args) { // 缓存队列设置固定长度为2,为了快速触发rejectHandler BlockingQueue queue = new LinkedBlockingQueue(2); // 假设外部任务线程的来源由机房1和机房2的混合调用 UserThreadFactory f1 = new UserThreadFactory("第一机房"); UserThreadFactory f2 = new UserThreadFactory("第二机房"); UserRejectHandler handler = new UserRejectHandler(); // 核心线程为1,最大线程为2,为了保证触发rejectHandler ThreadPoolExecutor threadPoolFirst = new ThreadPoolExecutor(1,2,60, TimeUnit.SECONDS, queue,f1,handler); // 利用第二个线程工厂实例创建第二个线程池 ThreadPoolExecutor threadPoolSecond = new ThreadPoolExecutor(1,2,60, TimeUnit.SECONDS, queue,f2,handler); // 创建400个任务线程 Task task = new Task(); for (int i = 0; i < 10; i++) { threadPoolFirst.execute(task); threadPoolSecond.execute(task); } } }