0

次のコードがあります。

public Move chooseMove(Board board) {

    // start parallel thread
    this.tn = new TreeNode(this.myboard, this, null);
    tn.stop = false;
    this.curT = (new Thread(tn));
    this.curT.start();


    try {
        long startTime = System.currentTimeMillis();
        Thread.sleep(4000 );
        System.out.println(System.currentTimeMillis() - startTime);
    } catch (InterruptedException e) {
        e.printStackTrace();
    } finally {
        tn.stop=true;
        return getBestMove();
    }
}

出力は、5400ms のように 4000ms をはるかに超える値になることがあります。これは、スレッドが必要以上にスリープしていることを意味します。何か助けはありますか?ありがとう。

編集:指定された遅延の後に Thread#sleep が正確に停止するという保証はないことを理解しています。ただし、追加の 1400 ミリ秒は長い遅延です。基本的に、私はゲーム プレイヤー エージェントを実装しています。タスクを実行し、5 秒後にサーバーに値を返す方法が必要です (または、サーバーがゲームを終了します)。サーバーは java.util.Timer.schedule(TimerTask タスク、長い遅延) を使用しています。上記のコードでは、メイン スレッドと並行して実行されているスレッドは 1 つだけです。これは this.curT です。

4

3 に答える 3

1

これは一般的な動作であり、Thread#sleepjavadoc で説明されています。

現在実行中のスレッドを、指定されたミリ秒数だけスリープ (一時的に実行を停止) させます。これは、システム タイマーとスケジューラの精度と精度に従います

これに基づいてThread#sleep、パラメーターに指定されたミリ秒単位でスレッドの作業を停止できる保証はありません。

于 2013-04-21T19:37:38.547 に答える