2011-12-24 24 views
5

Tôi sử dụng java.util.Timer để kích hoạt công việc trong ứng dụng của mình, nhưng tôi thấy rằng nó phụ thuộc vào thời gian hệ thống: nếu thời gian hệ thống được điều chỉnh, trình kích hoạt của bộ hẹn giờ sẽ bị ảnh hưởng.Hẹn giờ ổn định độc lập với thời gian hệ thống

Ví dụ: nếu thời gian hệ thống quay lại sau 80 giây, bộ hẹn giờ sẽ ngừng hoạt động trong 80 giây.

Java có phương thức System.nanoTime độc lập với thời gian hệ thống, nhưng có vẻ như không thể sử dụng trong Timer.

Có thư viện hẹn giờ hỗ trợ những gì tôi cần không? Hay tôi phải tự mình thực hiện nó?

Chú ý rằng tôi không cần phải có thời gian hiện tại chính xác (ngày), tôi cần một khoảng thời gian chính xác

+0

Vì Java 5.0 (2004), bạn có thể sử dụng ScheduledExecutorService. –

+1

@PeterLawrey, nanoTime tồn tại kể từ khi phát hành tương tự, vì vậy OP nên biết về ScheduledExecutor. – bestsss

+0

Tôi đã sử dụng ScheduledExecutoeService, nhưng tôi đang gặp vấn đề với JVM 64 bit. Hãy giúp http://stackoverflow.com/questions/9044423/java-scheduler-which-is-completely-independent-of-system-time-changes – YoK

Trả lời

6

bạn có 2 lựa chọn:

  • Viết một bộ đếm thời gian của bạn, tương đối tầm thường. Trước khi bất cứ ai nói với reinvent the wheel, việc có thể tự thực hiện nhiệm vụ luôn quan trọng. Đặc biệt khi có khoảng 20 dòng mã.
  • Sử dụng java.util.concurrent.ScheduledThreadPoolExecturor và sử dụng scheduleAtFixedRate, hàng đợi. dựa trên System.nanoTime.
  • Cài đặt ntp daemon điều chỉnh thời gian bằng cách điều chỉnh (làm chậm, tăng tốc) đồng hồ hệ thống với thời trang rất nhỏ trong khoảng thời gian dài.

Một vài thứ khác, 100ms hoàn hảo là thứ tự cao trong môi trường GC không phải thời gian thực vì GC có thể STW (dừng chân trên thế giới) trong vài giây. CN của CN không thể làm điều đó một cách đáng tin cậy. Metronome của IBM chạy trên hạt nhân Linux đã sửa đổi được cho là có khả năng. Bạn có thể muốn chú ý nếu ứng dụng của bạn thực sự yêu cầu thời gian thực.

0

Nếu máy tính của bạn đang bị cô lập và tắt Internet tôi nghĩ rằng không có nhiều bạn có thể làm nếu người dùng tampers với đồng hồ.

Mặt khác, nếu không phải như vậy, bạn sẽ tìm thấy khá nhiều API và Mashup cho phép bạn đọc đúng thời điểm. Bạn có thể đọc thời gian từ đó. Bạn có thể đọc thời gian từ time.gov. Ngoài ra twinsun.com bạn cung cấp cho bạn nhiều tùy chọn bổ sung.

100ms có vẻ quá thấp để truy cập Internet.

+0

Vâng, một giải pháp khác là để hệ thống tự động điều chỉnh thời gian hệ thống theo tần suất phù hợp. Nếu phạm vi thay đổi trong 1 hoặc 2 giây, điều đó có thể được chấp nhận. Nhưng đó không phải là cách hoàn hảo. – jean

Các vấn đề liên quan