Использует Java Timer, затем переключается на ScheduledExecutorService, но моя проблема не устранена. As Задачи, запланированные до изменения системного времени (через ntpd), не выполняются при указанной задержке. Не иметь логи же, как ничего не происходит :(Java-планировщик, который полностью не зависит от изменения системного времени
используя JRE 1.6.0_26 64 бит в моей цели на 64 битной Linux
Update:... ScheduledExecutorService отлично работает на Windows, проблема только на 64 разрядная система на базе Linux работает 64-битной JVM. Это отлично работает на 64 битном Linux под управлением 32-разрядную JVM ... странно. не нашли никаких ссылок на то же самое на любых блогах либо.
JAVA SDK IBM имеет те же проблемы (ibm-java-sdk-7.0-0.0-x86_64-archive.bin).
я подал дефект против JDK 7139684, он был принят, но был закрыт и отметился дублем 6900441. Пожалуйста, проголосуйте за него, если вы чувствуете, его стоит, чтобы ее исправить ... Я понятия не имею, почему его не было зафиксировано уже более двух лет
Вот пример кода, я использовал, чтобы проверить этот вопрос :
package test;
import java.io.IOException;
import java.util.Date;
import java.util.concurrent.Executors;
import java.util.concurrent.ScheduledExecutorService;
import java.util.concurrent.TimeUnit;
/**
* @author yogesh
*
*/
public class TimerCheck implements Runnable {
ScheduledExecutorService worker;
public TimerCheck(ScheduledExecutorService worker) {
super();
this.worker = worker;
this.worker.schedule(this, 1, TimeUnit.SECONDS);
}
private static void update() {
System.out.println("TimerCheck.update() "+new Date(System.currentTimeMillis()));
}
@Override
public void run() {
update();
worker.schedule(this, 1, TimeUnit.SECONDS);
}
/**
* @param args
*/
public static void main(String[] args) {
ScheduledExecutorService worker = Executors.newScheduledThreadPool(1);
new TimerCheck(worker);
}
}
Этот образец кода отлично работает на моей машине ubuntu 11.10 [32 бит], JVM 1.6.0_21 [32 бит]. Изменение системных часов не влияет на выполнение. – Gopi
да и проверял, что он отлично работает на 64-битном Linux-запуске 32-битного jvm :(. Обновил мой вопрос соответственно. – YoK
Я хотел бы указать, что указание наносекундов в этом случае бессмысленно. Внутренне код в любом случае изменяется на миллисы. Итак, 'worker.schedule (это, 1000000000, TimeUnit.NANOSECONDS);' идентичен 'worker.schedule (это, 1, TimeUnit.SECONDS);' –