Здесь мой простой код для циклирования каждую секунду (не обязательно точный) и при необходимости начинайте работу:
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 не увеличивает "Total waited" каждую секунду, как я ожидал. На самом деле это совсем не меняется. Я даже закрыл jconsole и начал его резервное копирование в надежде, что, возможно, это заставит обновить, но снова получит одинаковые цифры. Я не знаю, какое другое объяснение могло бы быть, кроме того, что jvm неправильно висел в команде сна. В мои годы, однако, у меня было так мало проблем с jvm, что я предполагаю, что это должно быть надзором с моей стороны.
note: Другая вещь, которую следует отметить, - это то, что никакой другой поток не активен. IOW - процессор почти не работает. Я где-то читал, что Thread.sleep может быть законно голоден, если другой поток активен, но здесь это не так.
версия солярия:
$ 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)