2016-11-14 28 views
0

私はティック/タイムステップベースのシミュレーションをいくつか実行しています。すべてのティックの後、オブジェクトは移動し、状態が変化します。私は同じ目標のために3つの異なる戦略を比較しようとしています。最も速い戦略が勝ちます。コードは次のようになりますJavaスレッドがアイドル状態か計算中かどうかを確認する方法は?

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; 
} 

ここで、いくつかの戦略は非常に簡単で計算はほとんど必要ありません。 1つは私に無作為な目標を与えることです。精巧な計画が必要なものもあります。今私は多くのシミュレーションを実行する必要があるので、sleepAmountをできるだけ低くしたいと思います。しかし、もし私がそれをあまりにも低く置くと、より簡単な戦略はより少ない計算を必要とするので、より速いかもしれないことは恐れる。今私の質問は、スレッドが計算しているか、実際には本当にスリープ/アイドル状態かどうかをチェックする方法はありますか?または、どのようにしてsleepAmountの可能な最低限の制限を見つけることができ、すべてのタイムステップがスリープ時間を正確に取るようにしますか?その戦略の違いは、タイムステップを増やす人もあれば、より長いタイムステップを持つ人でもないということです。

私の現在のsleepAmountは50msで、すべてが正常に動作しているようですが、1回の試行に約1分かかってしまい、約5回の試行で約50回試行したいと思います。これは数時間かかるので時間がかかりすぎます。そう考えていますか?

編集:私は、私はあなたがCyclicBarrierをオブジェクトをしたいと思いますtime = (System.currentTimeMillis() - startTime);

+0

私はあなたがなぜ寝る必要があるのか​​混乱しています。なぜ計算を終了しないのですか? – markspace

+0

ほとんどの計算を必要としない単純な戦略は、長い計算よりもはるかに高速であるためです。 – Hakaishin

+0

それは別の戦略を使用するポイントですか?より速く進むには?あなたがスリープラインを取り外すときに望ましくないと思われることはどうなりますか? – markspace

答えて

1

経過時間として時間を測定します。各戦略が1つのステップ(サイクル)を終えると、障壁を待つ。すべてのスレッドが待機しているときに、1つのスレッドに次のサイクルの準備をするためのクリーンアップアクティビティの実行許可が与えられます。その後、すべてのスレッドが解放されてステップが実行されます。 javadocsに例があります。

+0

ああ、この音は私が必要とするものとまったく同様に、チェックアウトします。 – Hakaishin

関連する問題