/** * * @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; }拒绝策略的实现根据前面提到的各种策略的具体实现方式,具体的代码实现如下所示:
private void reject(Runnable runnable) throws InterruptedException { switch (policy) { case ABORT: throw new RuntimeException("task queue is full"); case CALLER_RUN: runnable.run(); case DISCARD: // 直接放弃这个任务 return; case DISCARD_OLDEST: // 放弃等待时间最长的任务 也就是队列当中的第一个任务 taskQueue.poll(); execute(runnable); // 重新执行这个任务 } }线程池关闭实现一共两种方式实现线程池关闭:
- 直接关闭线程池,不管任务队列当中的任务是否被全部执行完成 。
- 安全关闭线程池,先等待任务队列当中所有的任务被执行完成,再关闭线程池,但是在这个过程当中不允许继续提交任务了,这一点已经在函数 checkPoolState 当中实现了 。
经验总结扩展阅读
- [WPF] 抄抄超强的苹果官网滚动文字特效实现
- 交管12123电动车罚款怎么缴费流程一览
- 秦时明月配音演员表介绍?
- 谁敢动我灵鹫宫的人是第几集?
- 河南移动卡套餐 移动卡套餐一览表
- 防盗门门框松动应该怎么处理
- 暖手袋会自动断电吗 暖手袋有点漏水还能用吗
- 淘宝八月份有什么满减活动2023
- 寿命最长的爬行动物排行榜
- 世界上移动速度最快的蛇是什么蛇 世界上移动速度最快的蛇排行榜