手写简单线程池

线程池

线程池:
问题:在JDK中什么代表线程池?Executor
线程池其实就是一个生产者消费者模型
生产者:提交任务的线程
消费者:处理任务的线程
产品:任务

问题:大家以前是如何创建线程池的?
Executors里面的静态方法
注意事项:
工作中不要使用Executors里面的静态方法去创建线程里。
原因:这样创建的线程池,里面的阻塞队列都是LinkedBlockingDeque, 可以’无限’缓存任务。
在并发量比较高的场景中,容易导致OOM.
最好使用ThreadPoolExecutor去创建线程池

public class MyThreadPool implements Executor {
    private static final int DEFAULT_CAPACITY = 100;
    private static final int MAX_CAPACITY = Integer.MAX_VALUE - 8;

    private BlockingQueue<Runnable> tasks;
    private int size = 10; // 处理任务的线程数目

    public MyThreadPool() {
        tasks = new ArrayBlockingQueue<>(DEFAULT_CAPACITY);
        init(); // 创建线程,并就绪
    }

    public MyThreadPool(int capacity) {
        if (capacity <= 0 || capacity > MAX_CAPACITY) {
            throw new IllegalArgumentException("capacity=" + capacity);
        }
        tasks = new ArrayBlockingQueue<>(capacity);
        init();
    }

    private void init() {
        for (int i = 0; i < size; i++) {
            new WorkThread().start();
        }
    }


    @Override
    public void execute(Runnable command) {
        try {
            tasks.put(command); // 提交任务
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }

    private class WorkThread extends Thread{
        @Override
        public void run() {
            while (true) { // 死循环:回收线程
                try {
                    tasks.take().run();
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
        }
    }
}

/* JDK:BlockingQueue<E> |-- ArrayBlockingQueue: 容量大小固定 |-- LinkedBlockingDeque: 容量大小步固定,除非指定大小。 */
public class MyBlockingQueue<E> {
    private static final int DEFAULT_CAPACITY = 10;
    private static final int MAX_CAPACITY = Integer.MAX_VALUE - 8;
    // 属性
    private int front;
    private int rear;
    private int size;
    private E[] elements;

    @SuppressWarnings("unchecked")
    public MyBlockingQueue() {
        elements = (E[]) new Object[DEFAULT_CAPACITY];
    }

    @SuppressWarnings("unchecked")
    public MyBlockingQueue(int initialCapacity) {
        if (initialCapacity <= 0 || initialCapacity > MAX_CAPACITY) {
            throw new IllegalArgumentException("initialCapacity=" + initialCapacity);
        }
        elements = (E[]) new Object[initialCapacity];
    }

    public synchronized void enqueue(E e) {
        // 判断队列是否满
        // if (size == elements.length) {
        while (size == elements.length) { // Caution! 不能够使用if
            try {
                wait();// t1, t2
            } catch (InterruptedException e1) {
                e1.printStackTrace();
            }
        }
        // 添加元素
        elements[rear] = e;
        rear = (rear + 1) % elements.length;
        size++;
        // 队列不空, 需要唤醒其它线程
        notifyAll();
    }

    public synchronized E dequeue() {
        // 判断队列是否为空
        // if (size == 0) {
        while (size == 0) {
            try {
                wait();
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
        // 删除元素
        E removeValue = elements[front];
        elements[front] = null;
        front = (front + 1) % elements.length;
        size--;
        // 队列不满,唤醒其它线程
        notifyAll();
        return removeValue;
    }

    public synchronized E peek() {
        while (size == 0) {
            try {
                wait();
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
        return elements[front];
    }

    public synchronized boolean isEmpty() {
        return size == 0;
    }

    public synchronized int size() {
        return size;
    }
}

全部评论

相关推荐

暑期是进不了大厂了想问问前端友友们&nbsp;,后面应该如何沉淀自己,我想秋招再冲一下尤其是八股,应该抓哪一块是重点,理解到什么程度呢,要学到什么深度才能抗住拷打。还有场景题如何去准备。期待友友们的解答。
命烈焰带我飞走:找个中厂小厂先看看吧,去了熟悉熟悉项目,简历上扒点东西,之后刷刷sobb上百度美团快手的日常实习,流程都比较快轮次也少,别给自己太大压力,一步一步来,先不用想着暑期,转正,秋招那些事情,另外如果可能的话可以关注下面试时候的形象,穿搭,环境这些,其实实习主要就是看个眼缘,看着好看声音好听其实加分不少..八股这些不要死记硬背,挨个拿去问问chatgpt,这个东西做出来是为了解决什么问题,有啥效果,自己有想法有个模糊的概念就可以了,人家也知道你是学生,实习生没有什么kpi,放你去面都是希望能把你招进去的,场景题算法题没做过你可以边试着写边跟面试官说你的想法思路,也可以直说没见过让他们给你提示,反正最后都是与或非顺序分支循环存取值那套。总之建议是别为了秋招..出去旅旅游放松放松,少投几家少背八股多写写代码
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客企业服务