并发编程之定时线程池上课笔记_第1页
并发编程之定时线程池上课笔记_第2页
并发编程之定时线程池上课笔记_第3页
并发编程之定时线程池上课笔记_第4页
并发编程之定时线程池上课笔记_第5页
已阅读5页,还剩3页未读 继续免费阅读

付费下载

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、定时任务 ScheduledThreoolExecutor:介绍:之前讲的ThreoolExecutor 是 java 的普通线程池。而 ScheduledThreoolExecutor 是 java 提供的定时任务线程池。使用:常用oolExecutor#schedule 定时任务java.util.concurrent.ScheduledThreoolExecutor#scheduleAtFixedRate 固定速率连续执行java.util.concurrent.ScheduledThreoolExecutor#scheduleWithFixedDelay 非固定速率连续执行java.u

2、til.concurrent.ScheduledThreoolExecutor.DelayedWorkQueue 延迟队列java.util.concurrent.ScheduledThre源码分析:初始化 ScheduledThreoolExecutor调度构造器public ScheduledThre oolExecutor(corePoolSize) super(corePoolSize,eger.MAX_VALUE, 0, NANOSECONDS,new DelayedWorkQueue();scheduleAtFixedRate 方法delayedExecute#ScheduledT

3、hre oolExecutor 方法/总结:add 方法是通过DelayedWorkQueue(初始化时候指定的队列) 延迟队列实现 offer 获取对象的延迟if (isShutdown() &!canRunInCurrentRunS e(task.isPeriodic() & /判断是否已经停止remove(task)if (isShutdown()reject(task);else super.getQueue().add(task);/增加任务 子类实现了public ScheduledFuture scheduleAtFixedRate(Runnabled,long initialD

4、elay,long period,TimeUnit unit) if (d = null | unit = null)throw new NullPo erException();if (period = 0)throw new IllegalArgumentException();ScheduledFutureTask sft =new ScheduledFutureTask(d,null,triggerTime(initialDelay, unit),unit.toNanos(period);/处理时间RunnableScheduledFuture t = decorateTask(d,

5、sft);sft.outerTask = t;delayedExecute(t); return t;Offer#DelayedWorkQueue 二叉树堆排序算法siftUp#DelayedWorkQueue 保证相同的while (k 0) publicoffer(Runnable x) if (x = null)throw new NullPo erException();RunnableScheduledFuture e = (RunnableScheduledFuture)x; /类final ReentrantLock lock = this.lock;lock.lock();tr

6、y i = size;if (i = queue.length)/判断是否扩容grow();size = i + 1;if (i = 0) queue0 = e;/这个队列是setIndex(e, 0); /第一个直接设置索引和下标 0 else siftUp(i, e);/看这儿if (queue0 = e) leader = null;available.signal();/唤醒 finally lock.unlock();return true;task.cancel(false);elseensurePrestart();compareTo#ScheduledFutureTask在回到

7、开始的地方,根据刚才跟代码可以看到执行时间的顺序已经分配好了,那如何确保 work 可以运行了?确保有work 执行ensurePrestart#ThreoolExecutorif (other = this) / compare zero if same objectreturn 0;if (other instanceof ScheduledFutureTask) ScheduledFutureTask x = (ScheduledFutureTask)other;long diff = time - x.time; /判断 timeif (diff 0)return 1;else if

8、(sequenceNumber x.sequenceNumber)return -1;elsereturn 1;long diff = getDelay(NANOSECONDS) - other.getDelay(NANOSECONDS);return (diff 0) ? 1 : 0;parent = (k - 1) 1;RunnableScheduledFuture e = queueparent;if (pareTo(e) = 0)break;queuek = e;setIndex(e, k);k = parent;queuek = key;setIndex(key, k);放到队列 r

9、unwork take 对象take#DelayedWorkQueue/调用startrunrunWorker-getTasktake 方法public RunnableScheduledFuture take() throwserruptedException final ReentrantLock lock = this.lock;lock.lock erruptibly();try for (;) RunnableScheduledFutureif (第一个有没有 没有等着available.await();else long delay =到时间了if (delay = 0)/到时间了

10、return finishPoll();else if (leader != null)available.await();/因为没有执行线程初始化,所以等等什么时候有了自己被他人唤醒else Thread thisThread = Thread.currentThread(); leader = thisThread;try available.awaitNanos(delay);/各种 condition 的 awaitNanos 带时间的 finally if (leader = thisThread) leader = null; finally wc = workerCountOf(ctl.get();if (wc 0) /看这个大于 0 和小于 0 的区别time += p; /假如延迟了这个时间早过了,+当前时候肯

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论