拒绝策略的实现根据前面提到的各种策略的具体实现方式,具体的代码实现如下所示:
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 当中实现了 。
【自己动手写线程池——向JDK线程池进发】 // 强制关闭线程池 public synchronized void stop() { isStopped = true; for (Worker worker : workers) { worker.stopWorker(); } } public synchronized void shutDown() { // 先表示关闭线程池 线程就不能再向线程池提交任务 isStopped = true; // 先等待所有的任务执行完成再关闭线程池 waitForAllTasks(); stop(); } private void waitForAllTasks() { // 当线程池当中还有任务的时候 就不退出循环 while (taskQueue.size() > 0) { Thread.yield(); try { Thread.sleep(1000); } catch (InterruptedException e) { e.printStackTrace(); } } }工作线程的工作实现 @Override public void run() { // 先执行传递过来的第一个任务 这里是一个小的优化 让线程直接执行第一个任务 不需要 // 放入任务队列再取出来执行了 firstTask.run(); thisThread = Thread.currentThread(); while (!isStopped) { try { // 是否使用时间就在这里显示出来了 Runnable task = useTimed ? taskQueue.poll(keepAliveTime, unit) : taskQueue.take(); if (task == null) { int i; boolean exit = true; // 如果当前线程数大于核心线程数 则使用 CAS 去退出 用于保证在线程安全下的退出 // 且保证线程的个数不小于 corePoolSize 下面这段代码需要仔细分析一下 if (ct.get() > corePoolSize) { do{ i = ct.get(); if (i <= corePoolSize) { exit = false; break; } }while (!ct.compareAndSet(i, i - 1)); if (exit) { return; } } }else { task.run(); } } catch (InterruptedException e) { // do nothing } } }
推荐阅读
-
-
-
-
-
孩子有了个假想中的朋友,家长速度反思是否平时忽略了孩子?
-
-
-
-
-
-
-
-
-
-
-
-
-
分享华为手机换电池步骤 华为智能手机怎么换电池教程
-
-