2010-08-12 18 views
6

Tôi có hộp bằng cách sử dụng ntp và chúng tôi có một số chương trình java chạy trên chúng hiển thị đồng hồ. Vấn đề chúng tôi đang gặp là nếu bất cứ điều gì đá thời gian hệ thống ngược tất cả các bộ hẹn giờ của chúng tôi làm những việc như animate đồng hồ dừng lại và chờ cho đến khi hệ thống bắt kịp trở lại nơi nó được. Tôi cần phải tìm một cách để phát hiện khi thời gian hệ thống bị thay đổi ngược và đặt lại tất cả bộ hẹn giờ hoặc bộ hẹn giờ có thể lập lịch nhiều lần nhưng vẫn là bằng chứng chống lại việc thay đổi đồng hồ.Phát hiện xem thời gian hệ thống đã được chuyển ngược lại trong java hay bộ hẹn giờ thời gian bằng chứng

Lưu ý: Tôi đã thử gói bộ hẹn giờ thạch anh có cùng sự cố với bộ hẹn giờ java thông thường.

+0

Đồng hồ chạy xa bao xa? ntp thường sử dụng đồng hồ xoay để di chuyển đồng hồ hoặc hướng và không cần phải thay đổi nó bằng một số lượng lớn giây. – Gray

+0

có một số lỗi trong hệ thống đang gõ thời gian trở lại nhiều nhất là 3 hoặc 4 giờ. Hầu như chúng tôi có 2 máy chủ ntp cạnh tranh không thể đồng ý. – tharris

Trả lời

5

Khá nhiều bộ hẹn giờ đặt thời gian trong tương lai và sau đó thường xuyên so sánh thời gian hiện tại với thời gian đã định. Đó là lý do tại sao bộ đếm thời gian "gian hàng" khi thời gian thực quay trở lại.

Thật không may, TẤT CẢ bộ tính giờ trong JVM có liên quan đến thời gian trong ngày. Ví dụ, java.util.Timer thực hiện một Object.wait (milliSeconds) cho một sự kiện để kích hoạt. Đó là một cuộc gọi thread cũng chờ đợi, cho t mili giây. Và nó luôn luôn liên quan đến "thời gian trong ngày". Vì vậy, về cơ bản không có cách nào thực sự để làm điều này trong java mà không có một vòng quay, CPU hút chờ đợi thời gian để đi lạc hậu để thông báo cho bộ định thời bạn quan tâm để thiết lập lại. Quay lại đầu trang |

+0

Yea thats về những gì tôi muốn đi lên với cũng có, tuy nhiên tôi đã thấy rằng Thread.sleep() là miễn dịch với đồng hồ hệ thống đang thay đổi.Vì vậy, tôi đoán tôi có thể có một sợi ngủ cho 1 thứ hai sau đó kiểm tra xem thời gian đã di chuyển ngược chưa. – tharris

1

Có vẻ như tiện ích đồng hồ là nội dung bị hỏng. Một widget UI sẽ hiển thị trạng thái hiện tại của mô hình, nơi mà mô hình, trong trường hợp này, là thời gian của hệ thống. Chắc chắn, đối với đồng hồ, bạn cần phải lên lịch repaint() mỗi giây, nhưng khi xảy ra sự cố, nó sẽ hiển thị thời gian của hệ thống, không cố gắng theo dõi thời gian.

Nguyên tắc này sẽ áp dụng ngay cả đối với các thành phần không phải giao diện người dùng. Xác định dung sai của thành phần với các lỗi thời gian và có một chuỗi nền làm mới thành phần tại khoảng thời gian đó. Tuy nhiên, trong thời gian làm mới, thời gian hệ thống được sử dụng, không phải là đồng hồ bên trong độc lập.


Cập nhật:

Các cơ bản ScheduledExecutorService không bị vấn đề này, ít nhất là trên nền tảng của tôi.

ScheduledExecutorService worker = Executors.newScheduledThreadPool(1); 
worker.schedule(new Runnable() { 
    public void run() 
    { 
    update(); 
    } 
}, 100, TimeUnit.MILLISECONDS); 
+0

Vấn đề không phải là widgit đang cố gắng theo dõi thời gian, nó gọi Date mới() một lần thứ hai, nếu bạn di chuyển ngược thời gian hệ thống thì các bộ hẹn giờ java thực sự cập nhật/animate đồng hồ hệ thống quay trở lại vị trí trước đó. – tharris

+0

@tharris - Tôi hiểu; Tôi đã không gặp phải vấn đề đó trước đây. Tuy nhiên, việc triển khai 'ScheduledExecutorService' mà tôi sử dụng dường như miễn nhiễm với vấn đề, và có một API tương tự với lớp' Timer' (mặc dù nó là một phần của gói 'java.util.concurrent' mới hơn và mạnh mẽ hơn). Xem bản cập nhật của tôi để biết ví dụ. – erickson

+0

@erickson: (điều này không làm việc với ubuntu 11,10 java 6 cập nhật 26. Tôi cũng có câu hỏi trên cùng một http://stackoverflow.com/questions/9044423/java-scheduler-which-is-completely-independent-of hệ thống-thời gian thay đổi – YoK

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