scheduledThreadPoolExecutor是咋实现周期任务调度的
创建ScheduledThreadPoolExecutor时,会创建一些Wokrer线程,这些线程会从任务队列获取任务,若没有,则wait; // 这里有问题,应该是提交任务时,附带创建Worker。提交任务到ScheduledThreadPoolExecutor后,会任务放入到任务队列DelayedWorkQueue,按照预定的执行时间通过堆排序确定任务的顺序,并唤醒Worker进程;DelayedWorkQueue会计算第一个任务的延迟时间,当排在第一位的任务可以开始执行后,才会返回任务给Worker;能拿到任务的Worker开始工作,拿不到的就继续wait。谢 @郭无心 提醒,应该是提交任务时,附带创建Worker。
■网友
首先介绍下ScheduledThreadPoolExecutor中的addTask的一些方法//添加一个立即执行的非周期Runnable任务,无返回值public void execute(Runnable command) { if (command == null) throw new NullPointerException(); schedule(command, 0, TimeUnit.NANOSECONDS);}//添加一个立即执行的非周期Runnable任务,有返回值public Future\u0026lt;?\u0026gt; submit(Runnable task) { return schedule(task, 0, TimeUnit.NANOSECONDS);}//添加一个立即执行的非周期Runnable任务,带返回值 泛型方法public \u0026lt;T\u0026gt; Future\u0026lt;T\u0026gt; submit(Runnable task, T result) { return schedule(Executors.callable(task, result), 0, TimeUnit.NANOSECONDS);}//添加一个立即执行的Callable任务 泛型方法public \u0026lt;T\u0026gt; Future\u0026lt;T\u0026gt; submit(Callable\u0026lt;T\u0026gt; task) { return schedule(task, 0, TimeUnit.NANOSECONDS);}趁着说明一下泛型方法:是否拥有泛型方法,与其所在的类是否是泛型没有关系。泛型方法使得该方法能够独立于类而产生变化,原则:无论何时,只要你能做到,你就应该尽量使用泛型方法,另外static方法无法访问泛型类的类型参数,所以,如果static方法需要使用泛型能力,就必须使其成为泛型方法。------------------------------------------------------------------------------------------//添加一个延迟delay执行的非周期Runnable任务 无返回值public ScheduledFuture\u0026lt;?\u0026gt; schedule(Runnable command,long delay,TimeUnit unit) { if (command == null || unit == null) throw new NullPointerException(); RunnableScheduledFuture\u0026lt;?\u0026gt; t = decorateTask(command, new ScheduledFutureTask\u0026lt;Void\u0026gt;(command, null,triggerTime(delay, unit))); delayedExecute(t); return t;}//添加一个延迟delay执行的非周期Callable任务public \u0026lt;V\u0026gt; ScheduledFuture\u0026lt;V\u0026gt; schedule(Callable\u0026lt;V\u0026gt; callable, long delay, TimeUnit unit) { if (callable == null || unit == null) throw new NullPointerException(); RunnableScheduledFuture\u0026lt;V\u0026gt; t = decorateTask(callable, new ScheduledFutureTask\u0026lt;V\u0026gt;(callable,\t \t\t\t triggerTime(delay, unit))); delayedExecute(t); return t; }//下面是周期性任务//固定频率周期性任务 每个任务开始的时间间隔都是periodpublic ScheduledFuture\u0026lt;?\u0026gt; scheduleAtFixedRate(Runnable command, long initialDelay, long period, TimeUnit unit) { if (command == null || unit == null) throw new NullPointerException(); if (period \u0026lt;= 0) throw new IllegalArgumentException(); RunnableScheduledFuture\u0026lt;?\u0026gt; t = decorateTask(command, new ScheduledFutureTask\u0026lt;Object\u0026gt;(command, null, triggerTime(initialDelay, unit), unit.toNanos(period))); delayedExecute(t); return t; }//延迟性周期任务 上个任务完成----\u0026gt;下个任务开始 之间是delay时间public ScheduledFuture\u0026lt;?\u0026gt; scheduleWithFixedDelay(Runnable command, long initialDelay, long delay, TimeUnit unit) { if (command == null || unit == null) throw new NullPointerException(); if (delay \u0026lt;= 0) throw new IllegalArgumentException(); RunnableScheduledFuture\u0026lt;?\u0026gt; t = decorateTask(command, new ScheduledFutureTask\u0026lt;Boolean\u0026gt;(command, null, triggerTime(initialDelay, unit), unit.toNanos(-delay))); delayedExecute(t); return t; }
推荐阅读
- 北京22家市属医院均开展安检基本实现重点区域安检措施全覆盖
- 长江流域渔民退捕“上岸”实现扩产新致富
- 实现“甜蜜计划”,这对中哈跨国夫妻好甜
- 北京地铁11号线西段三座车站提前实现主体结构封顶
- 特斯拉|特斯拉将全面发布全自动驾驶软件最新版,曾承诺年底实现完全无人干预
- |徐州建有农家书屋2205家,实现数字书屋全覆盖
- 阿里云|【GET2020】阿里云解航:在线教育帮助线下教育一起实现教育公平和个性化
- 我有几个app点子,拉出来比较容易实现的一个和大家探讨,只差程序员(替你们说了)请问这个点子咋样
- 一个利用量子纠缠实现超光速通讯的构想,可行吗
- 请问计算器求积分,求导,求极限怎样实现
