我有以下代码:
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正好停止。但是,额外的1400ms是一个长时间的延迟。基本上,我正在实现一个游戏玩家代理,我需要一种方法来运行任务,然后在5s后将值返回给服务器(否则服务器结束游戏)。服务器正在使用java.util.Timer.schedule(TimerTask任务,长延迟)。只有一个线程在主线程中运行concurent,在上面的代码中是this.curT,所以没有真正繁重的多线程。
答案 0 :(得分:2)
提供了两个重载版本的睡眠:一个指定睡眠时间为毫秒,另一个指定睡眠时间为纳秒。但是,这些睡眠时间并不能保证精确,因为它们受底层操作系统提供的设施限制。此外,睡眠周期可以通过中断终止,我们将在后面的部分中看到。在任何情况下,你都不能假设调用sleep会在指定的时间段内暂停线程。
答案 1 :(得分:1)
这是常见行为,在Thread#sleep
javadoc:
使当前正在执行的线程休眠(暂时停止执行)指定的毫秒数,受制于系统计时器和调度程序的精度和准确性。
基于此,不能保证Thread#sleep
停止线程的工作达到参数中规定的毫秒数。
答案 2 :(得分:1)
Thread#sleep
会让你的线程在完全 4秒后休眠,然后醒来。
一旦你的线程被唤醒,操作系统调度程序将它放在 runnable 队列中
当调度程序下次选择它时,它将成为正在运行的线程,即占用CPU。
因此OS调度程序可能会因操作系统,系统负载等而有所不同而产生额外的延迟开销。这与Java