Вот мой простой код для цикла каждую секунду (не обязательно быть точным ) и при необходимости начните работу:
while (true) {
// check db for new jobs and
// kick off thread if necessary
try {
Thread.sleep(1000);
} catch(Throwable t) {
LOG.error("", t);
}
}
Этот код отлично работает в течение нескольких месяцев. Буквально вчера у нас начались проблемы, связанные с зависанием одного из наших серверов в методе Thread.sleep (1000) . IOW - прошло больше суток, а Thread.sleep не вернулся. Я запустил jconsole и получил информацию о потоке.
Name: Thread-3
State: TIMED_WAITING
Total blocked: 2 Total waited: 2,820
Stack trace:
java.lang.Thread.sleep(Native Method)
xc.mst.scheduling.Scheduler.run(Scheduler.java:400)
java.lang.Thread.run(Thread.java:662)
Scheduler.java:400 - это строка Thread.sleep выше. Вывод jconsole не увеличивает "Всего ожиданий" каждую секунду, как я ожидал. На самом деле ничего не меняется. Я даже закрыл jconsole и снова запустил его в надежде, что это может вызвать обновление, но снова получил только те же числа. Я не знаю, какое еще может быть объяснение, кроме того, что jvm неправильно повесил команду сна. Однако в мои годы у меня было так мало проблем с jvm, что я полагаю, что это должно быть моей недосмотром.
примечание: еще следует отметить, что никакой другой поток не является активным. IOW - ЦП почти бездействует. Я где-то читал, что Thread.sleep мог бы законно голодать, если бы другой поток был активен, но здесь это не так.
версия solaris:
$ uname -a
SunOS xcmst 5.10 Generic_141415-08 i86pc i386 i86pc
версия java:
$ java -version
java version "1.6.0_26"
Java(TM) SE Runtime Environment (build 1.6.0_26-b03)
Java HotSpot(TM) Server VM (build 20.1-b02, mixed mode)