У меня есть следующий код:Thread.sleep себя причудливо
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();
}
}
Выход иногда значение, которое больше, чем способ 4000ms как 5400ms, что означает, что поток спит больше, чем следовало бы. Любая помощь? Спасибо.
EDIT: Я понимаю, что нет гарантии того, что Thread # sleep остановится точно после указанной задержки. Однако дополнительные 1400 мс являются большой задержкой. В основном, я реализую агента игрового игрока, и мне нужен способ запустить задачу, а затем вернуть значение на сервер после 5 секунд (иначе сервер завершит игру). Сервер использует java.util.Timer.schedule (задача TimerTask, длительная задержка). Существует только один поток, выполняющий совпадение с основным потоком, который является this.curT в коде выше, так что не очень тяжелая многопоточность.
Является ли процессор очень занятым, занимаясь другими вещами? Если процессор действительно измельчал, с большим количеством одновременной активности потока, поток не мог получить циклы некоторое время. – Gray
Как часто вы наблюдаете это поведение? Попробуйте запустить только ваш поток с вызовом сна без какого-либо другого кода. –
Если я запускаю Thread.sleep только в одном потоке, тогда он ведет себя корректно. но у меня есть только 2 потока в моем реальном коде, как показано выше. – Mouhyi