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

输出有时是一个大于 4000 毫秒的值,例如 5400 毫秒,这意味着线程的睡眠时间超出了应有的时间。有什么帮助吗?谢谢。

编辑:我知道在指定的延迟之后不能保证 Thread#sleep 恰好停止。但是,额外的 1400 毫秒是一个很长的延迟。基本上,我正在实现一个游戏玩家代理,我需要一种方法来运行任务,然后在 5 秒后向服务器返回一个值(否则服务器结束游戏)。服务器正在使用 java.util.Timer.schedule(TimerTask task, long delay)。在上面的代码中,只有一个线程与主线程并发运行,即 this.curT,因此并没有真正繁重的多线程。

4

3 回答 3

2

来自docs.oracle.com

提供了两种重载的睡眠版本:一种将睡眠时间指定为毫秒,另一种将睡眠时间指定为纳秒。但是,这些睡眠时间不能保证是精确的,因为它们受到底层操作系统提供的设施的限制。此外,睡眠周期可以通过中断来终止,我们将在后面的部分中看到。在任何情况下,您都不能假设调用 sleep 会在指定的时间段内暂停线程

于 2013-04-21T19:36:04.177 回答
1

Thread#sleep将使您的线程恰好休眠4 秒,然后唤醒。
一旦你的线程被唤醒,操作系统调度程序将它放在可运行队列中。
当它下一次被调度程序选中时,它将成为一个正在运行的线程,即会占用 CPU。
因此,由于操作系统调度程序可能会因操作系统、系统负载等而有所不同,因此会产生额外的延迟开销。这与Java

于 2013-04-21T20:18:56.440 回答
1

这是常见的行为,在Thread#sleepjavadoc 中有描述:

使当前执行的线程在指定的毫秒数内休眠(暂时停止执行),具体取决于系统计时器和调度程序的精度和准确性

基于此,不能保证Thread#sleep在参数中指定的毫秒数内停止线程的工作。

于 2013-04-21T19:37:38.547 回答