自定义线程池

自定义线程池需要什么

在这里插入图片描述

需要哪些类

在这里插入图片描述

MyTask

/**
 * 自定义线程池任务
 * 要求每个线程有自己的编号
 * 线程的执行时间为0.2s
 */
@Data
public class MyTask  implements Runnable{

    private  int id;

    MyTask(int id) {
        this.id = id;
    }


    @Override
    public void run() {
        String name = Thread.currentThread().getName();
        System.out.println("线程" + name + "开始执行任务" + id);
        try {
            Thread.sleep(200);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        System.out.println("线程" + name + "完成任务" + id);
    }
}

MyWorker

public class MyWorker extends Thread{
    private String name;
    private List<Runnable> tasks;

    MyWorker(String name, List<Runnable> tasks) {
        this.name = name;
        this.tasks = tasks;
    }

    @Override
    public void run() {
        while (true) {
            Runnable task = null;
            synchronized (tasks) {
                while (tasks.isEmpty()) {
                    try {
                        tasks.wait();
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                }
                task = tasks.remove(0);
            }
            System.out.println("线程" + name + "开始执行任务");
            task.run();
            System.out.println("线程" + name + "完成任务");
        }
    }
}

自定义线程池

  • 提交任务:没有超过最大线程数+ 队列长度,可以继续提交,超过则直接舍弃
  • 执行任务:如果小于核心线程数,则使用核心线程,小于最大线程数,使用最大线程,否则进入缓存
/**
 * 自定义线程池
 * 成员变量
 *  1. 任务队列 集合
 *  2. 当前线程数
 *  3. 最大线程数
 *  4. 核心线程数
 *  5. 任务队列最大长度
 * 成员方法
 * 1. 提交任务:将任务添加到任务队列中,判断是否超出任务的总长度
 * 2. 执行任务:从任务队列中取出任务执行,决定创建新的线程还是复用线程
 */
public class MyThreadPool {
    // 任务队列 线程安全
    private List<Runnable> tasks = Collections.synchronizedList(new ArrayList<>());
    // 当前线程数
    private int num;
    // 最大线程数
    private int maxNum;
    // 核心线程数
    private int coreNum;
    // 任务队列最大长度
    private int queueSize;

    public MyThreadPool(int coreNum, int maxNum, int queueSize) {
        this.coreNum = coreNum;
        this.maxNum = maxNum;
        this.queueSize = queueSize;
    }

    // 提交任务
    public void submit(Runnable task) {
        if (tasks.size() >= maxNum + queueSize) {
            System.out.println("任务已满,任务" + task + "被拒绝");
            return;
        }
        tasks.add(task);
        execTask(task);
    }

    // 执行任务
    private void execTask(Runnable task) {
        if (num < coreNum) {
            new MyWorker("核心线程" + num, tasks).start();
            num++;
        } else if (num < maxNum) {
            new MyWorker("非核心线程" + num, tasks).start();
            num++;
        }else {
            System.out.println("任务" + task + "被缓存");
        }
    }


}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值