实现线程池(二)最简单的线程池

r囧r小猫 2022-01-12 05:09 438阅读 0赞

我们首先实现一个能简单执行任务的线程池,很明显,这样的线程池需要具备两个要素,一个是工作线程,一个是任务队列

  1. //工作线程
  2. private List<Thread> workers;
  3. //任务队列
  4. private final BlockingQueue<Runnable> taskQueue;
  5. 复制代码

工作线程用于执行具体的每一个任务,而任务队列负责接收要执行的任务。

线程池实例化的时候,确定线程池工作线程个数poolSize和最大允许接受任务的个数maxAccept

  1. public MyThreadPool(int poolSize, int maxAccept) {
  2. workers = new ArrayList<>(poolSize);
  3. taskQueue = new ArrayBlockingQueue<>(maxAccept);
  4. this.poolSize = poolSize;
  5. this.maxAccept = maxAccept;
  6. }
  7. 复制代码

工作线程在线程池的初始化方法中创建和启动

  1. public synchronized void init() {
  2. if(!inited) {
  3. for (int i = 0; i < this.poolSize; i++) {
  4. Thread t = new Thread(new Runnable() {
  5. @Override
  6. public void run() {
  7. while (true) {
  8. try {
  9. //从任务队列中取任务,然后执行
  10. Runnable runnable = taskQueue.take();
  11. runnable.run();
  12. } catch (InterruptedException e) {
  13. }
  14. }
  15. }
  16. });
  17. workers.add(t);
  18. t.start();
  19. }
  20. } else {
  21. return;
  22. }
  23. inited = true;
  24. }
  25. 复制代码

线程池对外提供执行任务的方法

  1. public void execute(Runnable runnable) throws RejectException{
  2. if(this.taskQueue.size() < maxAccept) {
  3. this.taskQueue.add(runnable);
  4. } else {
  5. //线程池任务队列满了,抛出拒绝异常
  6. throw new RejectException();
  7. }
  8. }
  9. 复制代码

实例化线程池,并调用

  1. public static void main(String[] args) {
  2. MyThreadPool myThreadPool = new MyThreadPool(5,50);
  3. myThreadPool.init();
  4. try {
  5. myThreadPool.execute(new Runnable() {
  6. @Override
  7. public void run() {
  8. System.out.println("任务被执行了");
  9. }
  10. });
  11. } catch (MyThreadPool.RejectException e) {
  12. }
  13. }
  14. 复制代码

以上,我们实现了一个最简单的线程池

按照我们上一章中提到的,一个完备的线程池除了任务的执行之外,还应该具备以下条件

  • 线程的生命周期管理,主要包括创建和回收
  • 线程池的生命周期,初始化,执行,销毁等

显然,本例子中,并没有完整地体现线程和线程池的生命周期,我们实现的还有缺陷,下一章针对本部分进行完善。

转载于:https://juejin.im/post/5d04e296518825276a286983

发表评论

表情:
评论列表 (有 0 条评论,438人围观)

还没有评论,来说两句吧...

相关阅读

    相关 线实现

    想象这么⼀个场景:在学校附近新开了⼀家快递店,⽼板很精明,想到⼀个与众不同的办法来经营。店⾥没有雇⼈,⽽是每次有业务来了,就现场找⼀名同学过来把快递送了,然后解雇同学。这...

    相关 c++实现简单线

        线程池,先创建一定数目的线程,初始都处于空闲状态。当有新的任务进来,从线程池中取出一个空闲的线程处理任务,处理完成之后,该线程被重新放回到线程池中。当线程池中的线程都在

    相关 c++11简单线实现

    线程池是在处理高并发任务中有比较重要的价值,他的实现最基本原理就[生产者和消费者模型][Link 1],刚开始就开一定数量的线程,以程序中的某些功能模块为对象,以生产者与消费者