我目前正在使用
ScheduledFuture<?> schedulerFuture = scheduler.scheduleAtFixedRate(taskMaker, 0 , period, TimeUnit.MICROSECONDS);
ScheduledFuture<?> timerFuture = timer.schedule(timeAnalyser, time, TimeUnit.MICROSECONDS);
每秒执行许多任务,在多个线程中也是异步的。问题是,我得到的结果不准确。例如,当我想在一秒钟内在第一个线程中执行 3 个任务,在第二个线程中执行 7 个任务,在第三个线程中执行 5 个任务时,有时我会得到 4、7、6 或 3、6、6。这并不是说当使用更大的数字时,处理器无法做到这一点,但我每秒要执行的任务越多,不准确度就越大。可能是因为 timer
(停止 taskMaker
)的启动时间与 taskMaker
不完全相同?
有什么改变的建议吗?无论如何,使用 SchedulesExecutorService
执行如此高频率的任务是否正确?
最佳答案
各种ExecutorService
的实现使用一个工作队列,其目的是只要工作任务可用就使用下一个可用的线程来执行它,如果没有线程可用(忙),而不是创建一个新线程(在指定可用线程的限制内,如果达到此数量,它将等待线程变为可用),因此您无法控制线程......尤其是不执行哪些任务。
对于这样的 Executor
,您应该考虑实现您自己的 Executor,它可能会针对您的频率(3、7 和 5)使用 Executors.newSingleThreadScheduledExecutor()
。
例如:
ScheduledExecutorService exec1 = Executors.newSingleThreadScheduledExecutor();
ScheduledExecutorService exec2 = Executors.newSingleThreadScheduledExecutor();
ScheduledExecutorService exec3 = Executors.newSingleThreadScheduledExecutor();
exec1.scheduleAtFixedRate(task, 0, 1000 / 3, TimeUnit.MILLISECONDS);
exec2.scheduleAtFixedRate(task, 0, 1000 / 7, TimeUnit.MILLISECONDS);
exec2.scheduleAtFixedRate(task, 0, 1000/5, TimeUnit.MILLISECONDS);
关于java - 如何以每秒几个固定速率准确安排任务,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30750712/