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);
}
}
}