Вот мой простой код, который нужно циклически повторять каждую секунду (не нужно быть точным) и запускать работу, если это необходимо:
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)