Używał Java Timer, a następnie przełączono na ScheduledExecutorService, ale mój problem nie został naprawiony. Jako zadania zaplanowane przed zmianą czasu systemowego (przez ntpd) nie są wykonywane po określonym opóźnieniu. Nie mają dzienniki samo jak nic się nie dzieje :(Harmonogram Java, który jest całkowicie niezależny od zmian czasu systemowego
użyciu jre 1.6.0_26 64 bit w moim celem na 64 bitowym systemie Linux
Aktualizacja:... ScheduledExecutorService działa poprawnie na Windows Problem polega tylko na 64-bitowy Linux system oparty systemem 64 bitowym JVM. współpracuje na 64 bitowym systemem Linux 32 bit JVM ... dziwne. nie znaleziono żadnych odniesienie takie same na wszystkich blogach albo.
IBM Java SDK ma ten sam problem (ibm-java-sdk-7.0-0.0-x86_64-archive.bin) .
I złożył wadę przeciwko JDK 7139684, było akceptowane, ale został zamknięty i oznaczone duplikat 6900441. Proszę głosować na niego, jeśli czujesz warto aby to naprawić ... Nie mam pojęcia, dlaczego jej nie został ustalony od ponad kilku lat
Oto przykładowy kod kiedyś przetestować ten problem :
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);
}
}
Ten przykładowy kod działa poprawnie na moim komputerze Ubuntu 11.10 [32-bitowy], JVM 1.6.0_21 [32-bitowy]. Zmiana zegara systemowego nie wpływa na wykonanie. – Gopi
tak również sprawdził, czy działa poprawnie na 64-bitowym linuksie z 32-bitowym jvm :(odpowiednio zaktualizował moje pytanie – YoK
Chciałbym tylko wskazać, że określanie nanosekund jest w tym przypadku bez znaczenia. Wewnętrznie, kod zmienia się na millis. Tak więc 'employee.schedule (this, 1000000000, TimeUnit.NANOSECONDS);' jest identyczne z 'worker.schedule (this, 1, TimeUnit.SECONDS);' –