我正在运行一些基于滴答/时间步的模拟。每个滴答对象移动后状态发生变化。我试图比较同一目标的3种不同策略,最快的策略获胜。代码如下所示
for(Strategy strategy : strategies){
StopWatch watch.start();
while(termination_condition){
// goal is different for every strategy
goal = getGoal(strategy);
doStuff();
moveObjects();
changeStates();
sleep(sleepAmount);
}
watch.stop();
}
public Goal getGoal(Strategy strategy){
switch(strategy):{
case 1:
case 2:
case 3:
}
return goal;
}
现在有些策略非常简单,几乎不需要计算。一个是给我一个随机的目标。其他涉及精心策划。现在我希望sleepAmount尽可能低,因为我需要运行很多模拟。但我担心,如果我把它放得太低,更容易的策略可能会更快,因为它们需要更少的计算。现在我的问题是,有没有办法检查线程是在计算还是实际上正在睡眠/空闲?或者我怎样才能找到sleepAmount的最低可能限制,以便每个时间步长完全占用睡眠时间而不是更长?因此,策略之间的差异只是有些需要更多的时间步,而有些时间步长更长。
我目前的睡眠时间是50毫秒,一切似乎运行正常,但是一次试验需要大约1分钟,我想做约50次试验,大约有5种策略。这需要几个小时,这太长了。那么任何想法?
编辑:我将时间测量为经过时间time = (System.currentTimeMillis() - startTime);
答案 0 :(得分:1)
我认为你想要一个CyclicBarrier对象。当每个策略完成一个步骤(周期)时,它会在屏障处等待。当所有线程都在等待时,一个线程将被授予执行某些清理活动的权限,以准备下一个周期。然后释放所有线程以执行该步骤。 javadocs中有一个例子。