Dal*_*ale 5 java concurrency multithreading
我的困惑始于ScheduleAtFixedRate 方法的api 描述中的这段代码。
如果此任务的任何执行时间超过其周期,则后续执行可能会延迟开始,但不会同时执行。
如果不会并发执行,为什么还要有线程池呢?
另外,有没有办法实现并发执行?我希望它们在确切的时间段运行,即使先前的任务尚未完成。我想要并发执行。
该文档应解读为:
..后续执行[根据注册提供的可运行任务] ..不会同时执行
这并不意味着所有计划任务不会并发。相反,对于每个任务(通过调用 创建scheduleAtFixedRate),Runnable 一次仅在一个线程上执行 -即使执行时间超出了间隔。
这是一个明确的设计选择,因为在大多数情况下,任务回调的并发执行是不可取的,并且会导致失控的资源螺旋。例如,如果同时执行越来越多的(相同的)Runnable,则可能形成“任务炸弹”。
线程池监视器是准确的,因为该实现执行了它所宣传的功能 - 在任务执行过程中重用线程。
虽然没有标准的[线程池]执行器具有所请求的行为,但可以以有限的方式进行模拟。这是因为并发限制是针对每个已注册的任务(而不是每个可运行的),并且可以注册多个“相同”任务:
long targetPeriod = ..;
long n = targetPeriod * 2;
task1 = executor.scheduleAtFixedRate(runnable, 0, n, ..)
task2 = executor.scheduleAtFixedRate(runnable, n/2, n, ..)
Run Code Online (Sandbox Code Playgroud)
实际的执行/计时行为取决于各种其他因素,但是如果这两个注册任务占用 ~n/2(目标周期)来执行,则它们可以同时执行。
| 归档时间: |
|
| 查看次数: |
1340 次 |
| 最近记录: |