首页 > 技术文章 > 线程类简单应用

fdy-study-consist 2020-02-14 12:32 原文

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

 

推荐阅读