如何检查Java线程是空闲还是计算?

时间:2016-11-14 18:36:04

标签: java multithreading java-threads

我正在运行一些基于滴答/时间步的模拟。每个滴答对象移动后状态发生变化。我试图比较同一目标的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);

1 个答案:

答案 0 :(得分:1)

我认为你想要一个CyclicBarrier对象。当每个策略完成一个步骤(周期)时,它会在屏障处等待。当所有线程都在等待时,一个线程将被授予执行某些清理活动的权限,以准备下一个周期。然后释放所有线程以执行该步骤。 javadocs中有一个例子。