如何检查 Java 线程是否空闲或正在计算?
How to check if Java thread is idle or calculating?
我正在 运行 进行一些基于 tick/timestep 的模拟。在每个刻度对象移动并且状态改变之后。我试图比较同一目标的 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 尽可能低,因为我需要 运行 多次模拟。但我担心如果我把它放得太低,更简单的策略可能会更快,因为它们需要更少的计算。现在我的问题是,有没有办法检查线程是否正在计算或者实际上是否真的 sleeping/idle?或者我怎样才能找到 sleepAmount 的最低可能限制,以便每个时间步长都恰好花费 sleep 时间而不是更长?因此,这些策略之间的区别只是有些策略采用更多的时间步长,而不是有些策略的时间步长更长。
我当前的 sleepAmount 是 50 毫秒,一切似乎 运行 都很好,但是一次试验大约需要 1 分钟,我想对大约 5 种策略进行大约 50 次试验。这需要几个小时,这太长了。那么有什么想法吗?
编辑:我用经过的时间来衡量时间 time = (System.currentTimeMillis() - startTime);
我想你想要一个 CyclicBarrier 对象。当每个策略完成一个步骤(循环)时,它会在障碍处等待。当所有线程都在等待时,一个线程将被允许执行一些清理 activity 以准备下一个循环。然后释放所有线程以执行该步骤。 javadocs.
中有一个例子
我正在 运行 进行一些基于 tick/timestep 的模拟。在每个刻度对象移动并且状态改变之后。我试图比较同一目标的 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 尽可能低,因为我需要 运行 多次模拟。但我担心如果我把它放得太低,更简单的策略可能会更快,因为它们需要更少的计算。现在我的问题是,有没有办法检查线程是否正在计算或者实际上是否真的 sleeping/idle?或者我怎样才能找到 sleepAmount 的最低可能限制,以便每个时间步长都恰好花费 sleep 时间而不是更长?因此,这些策略之间的区别只是有些策略采用更多的时间步长,而不是有些策略的时间步长更长。
我当前的 sleepAmount 是 50 毫秒,一切似乎 运行 都很好,但是一次试验大约需要 1 分钟,我想对大约 5 种策略进行大约 50 次试验。这需要几个小时,这太长了。那么有什么想法吗?
编辑:我用经过的时间来衡量时间 time = (System.currentTimeMillis() - startTime);
我想你想要一个 CyclicBarrier 对象。当每个策略完成一个步骤(循环)时,它会在障碍处等待。当所有线程都在等待时,一个线程将被允许执行一些清理 activity 以准备下一个循环。然后释放所有线程以执行该步骤。 javadocs.
中有一个例子