采用如下所示的 ScheduledThreadPoolExecutor。如何为执行程序本身提供一个可以启动新线程的时间窗口。在该时间窗口之外,它应该停止以固定速率启动新线程。
executor = new ScheduledThreadPoolExecutor(1);
executor.scheduleAtFixedRate(new Runnable(){}, 0, 1, TimeUnit.DAYS);
例如,1 <窗口>
if executor has run for <= 1s stop launching thread
if executor has run for > 1s and < 3s. Start and keep launching thread
if executor has run for < 3s stop launching thread.
或者,如果可以给执行者一个超时,那也将起作用。请注意,我不是说给线程超时,而是给执行器本身。
我有一种解决方案可以在线程本身中添加时间跟踪器,但我想知道是否有更多本机方法可以这样做。
窗口>没有"本机"解决方案。
更好的方法是(只是抛出我的想法(
- 收集和存储从
scheduleAtFixedRate
退回的所有Future<?>
- 使用诸如Quartz之类的作业调度程序在特定时间/甚至另一个
ScheduledExecutor
启动作业 - 对 Quartz 作业启动的"事件"做出反应,取消所有存储的
Future<?>
(不关闭执行器(/即时更改Executor
实现以获得无操作自定义版本
这有点不切实际。恕我直言,我认为您正在尝试做一些聪明的事情,可以用更"标准"的方式解决。