Timer timer = new Timer(true);
timer.scheduleAtFixedRate(timerTask, 0, 1); // 1 = 1ms delay between each iteration
每次触发它都会运行一个超快速操作,它基本上不需要时间:基本上它需要当前毫秒经过的值,并在以毫秒为关键的Map中快速查找时递增它。
你认为1ms的延迟会太快吗?这是否会使系统陷入困境?尝试使用这款超级快速计时器有什么危险吗?
答案 0 :(得分:5)
也许。在当代计算机上,很多事情都可以在一毫秒内完成,因此它取决于很多事情。您可能应该找出可接受的最慢速率,然后选择1和该数字之间的合理值。这将每天执行更多约86,400,000次。这对你想要完成的事情有意义吗?
编辑:作为问题说明的一些评论,如果您假设计时器将始终以您提供的速率执行,则此方法可能存在根本缺陷。无论速率如何,你都无法做出这种假设。很难说,因为细节很少,但我觉得你应该考虑使用队列而不是地图。答案 1 :(得分:2)
取决于。
问自己这些问题:
一毫秒可能很长(高端游戏PC)或非常非常短(老一代智能手机),并且根据您的CPU架构,您最终会填充众多核心之一或计算时差的唯一核心。
对于您的数据结构:您可能需要类似于排序映射的内容,其中包含start作为键,持续时间作为值的一个字段。您将获取最接近的密钥少于您的时间,并检查存储的标题是否仍然有效......或类似的
答案 2 :(得分:0)
“你认为1ms的延迟会太快吗?” - 是的,并且它无法在每毫秒(特别是在加载时)启动任务,您可以自己测试(下面的小例子)。
“这会让系统陷入困境吗?” - 实际上不是很多(我的意思是主要是CPU时间)。如果您在循环中运行操作并且不会暂停,则会获得更多负载。您的系统将花费大量时间在上下文切换上开始您的任务,官员这是不可避免的开销,但如果您执行非常简单的任务,这个开销将与您的有用工作量相当。
“尝试使用这款超级快速计时器有什么危险吗?” - 正如您在上面写的“在毫秒是关键的地图中快速查找”时,您使用毫秒作为键,但是如果计数被破坏,则不会每毫秒运行一次。
static int inc = 0;
public static void main(String[] args) throws InterruptedException {
TimerTask timerTask = new TimerTask() {
public void run() {
inc++;
}
};
Timer timer = new Timer(true);
timer.scheduleAtFixedRate(timerTask, 0, 1);
Thread.sleep(500000);
timer.cancel();
timer.purge();
System.out.println(inc);
}