ct:表示当前线程池当中线程的个数 。
corePoolSize:线程池当中核心线程的个数,意义和上面谈到的JDK的线程池意义一致 。
maximumPoolSize:线程池当中最大的线程个数,意义和上面谈到的JDK的线程池意义一致 。
keepAliveTime 和 unit:和JDK线程池的参数意义一致 。
taskQueue:任务队列,用不保存提交的任务 。
policy:拒绝策略 , 主要有一下四种策略:
public enum RejectPolicy { ABORT, CALLER_RUN, DISCARD_OLDEST, DISCARD}
- workers:用于保存工作线程 。
- isStopped:线程池是否被关闭了 。
- useTimed:主要是用于表示是否使用上面的 keepAliveTime 和 unit , 如果使用就是在一定的时间内,如果没有从任务队列当中获取到任务,线程就从线程池退出 , 但是需要保证线程池当中最小的线程个数不小于 corePoolSize。
实现Runnable // 下面这个方法是向线程池提交任务 public void execute(Runnable runnable) throws InterruptedException { checkPoolState(); if (addWorker(runnable, false) // 如果能够加入新的线程执行任务 加入成功就直接返回 || !taskQueue.offer(runnable) // 如果 taskQueue.offer(runnable) 返回 false 说明提交任务失败 任务队列已经满了 || addWorker(runnable, true)) // 使用能够使用的最大的线程数 (maximumPoolSize) 看是否能够产生新的线程 return; // 如果任务队列满了而且不能够加入新的线程 则拒绝这个任务 if (!taskQueue.offer(runnable)) reject(runnable); }在上面的代码当中:
- checkPoolState函数是检查线程池的状态,当线程池被停下来之后就不能够在提交任务:
private void checkPoolState() { if (isStopped) { // 如果线程池已经停下来了,就不在向任务队列当中提交任务了 throw new RuntimeException("thread pool has been stopped, so quit submitting task"); } }
- addWorker函数是往线程池当中提交任务并且产生一个线程,并且这个线程执行的第一个任务就是传递的参数 。max表示线程的最大数目 , max == true 的时候表示使用 maximumPoolSize 否则使用 corePoolSize,当返回值等于 true 的时候表示执行成功,否则表示执行失败 。
/** * * @param runnable 需要被执行的任务 * @param max 是否使用 maximumPoolSize * @return boolean */ public synchronized boolean addWorker(Runnable runnable, boolean max) { if (ct.get() >= corePoolSize && !max) return false; if (ct.get() >= maximumPoolSize && max) return false; Worker worker = new Worker(runnable); workers.add(worker); Thread thread = new Thread(worker, "ThreadPool-" + "Thread-" + ct.addAndGet(1)); thread.start(); return true; }实现Callable这个函数其实比较简单 , 只需要将传入的Callable对象封装成一个FutureTask对象即可,因为FutureTask实现了Callable和Runnable两个接口,然后将这个结果返回即可,得到这个对象,再调用对象的 get 方法就能够得到结果 。
public <V> RunnableFuture<V> submit(Callable<V> task) throws InterruptedException { checkPoolState(); FutureTask<V> futureTask = new FutureTask<>(task); execute(futureTask); return futureTask; }
推荐阅读
-
-
-
-
-
2023年企业退休人员涨工资了 今年调涨方式是什么?哪些人可以参与?
-
蓝莓叶子发黄干枯原因及解决方法图片 蓝莓叶子发黄干枯原因及解决方法
-
-
借记卡是什么卡是信用卡吗 借记卡是什么卡 借记卡介绍
-
-
2022年男孩有哪些适合的名字 虎年男孩取名大全最新版
-
关于深圳中核集团有限公司的简介 深圳中核集团有限公司
-
-
-
牛蹄筋的做法大全窍门 牛蹄筋的功效与作用及食用 ***
-
-
-
有关坚持不懈的名人名言 坚持不懈相信自己的名人名言
-
-
-
四川泡萝卜的做法最正宗的做法视频 四川泡萝卜的做法?