Planuję zadanie za pomocą obiektu ScheduledThreadPoolExecutor. Używać w następujący sposób:ScheduledThreadPoolExecutor wykonanie niewłaściwego czasu z powodu niezgodności czasu procesora
public ScheduledFuture<?> schedule(Runnable command, long delay,TimeUnit unit)
i ustawienie opóźnienia do 30 sekund (opóźnienie = 30000 jednostka = TimeUnit.MILLISECONDS). Czasami moje zadanie pojawia się natychmiast, a czasami zajmuje to 70 sekund.
Wierzę, że ScheduledThreadPoolExecutor wykorzystuje zegary specyficzne dla procesora. Kiedy wykonywanie testów porównujące System.currentTimeMillis, System.nanoTime()() [który procesor specyficzne] i są opisane w następujących
planu: 1272637682651ms, 7858346157228410ns
wykonania: 1272637682667ms, 7858386270968425ns
Różnica polega 16ms ale 4011374001ns (lub 40,113ms)
tak wygląda istnieje rozbieżność pomiędzy dwoma zegarami procesora 40 sekund
Jak rozwiązać ten problem i n kodu java? Niestety jest to maszyna klienta i nie mogę zmodyfikować ich systemu.
Tricky one. Może "java.util.Calendar" będzie pomocny? Calendar.getInstance() i tak dalej .. –
Czy ten kod jest uruchamiany na maszynie wirtualnej (VMWare, KVM, Virtual PC)? Wirtualizacja może spowodować spustoszenie w zegarze procesora, nawet na poziomie milisekund. –
Działa bezpośrednio na komputerze z Windows XP Profession. Brak wirtualizacji. – richs