2012-07-03 17 views
7

Tôi có đoạn này mã đơn giản:ScheduledThreadPoolExecutor muộn

/** 
* @param args the command line arguments 
*/ 
public static void main(String[] args) { 
    ScheduledThreadPoolExecutor exec = new ScheduledThreadPoolExecutor(10); 

    Runnable r = new Runnable() { 

     @Override 
     public void run() { 
      System.err.println(Calendar.getInstance().getTime()); 
     } 
    }; 

    exec.scheduleAtFixedRate(r,0, 500, TimeUnit.MILLISECONDS); 
} 

Trên một máy, mã này chạy như mong đợi. Bảng điều khiển đầu ra:

  • Tue 03 tháng 7 10:32:34 EEST 2012
  • Tue 03 tháng 7 10:32:34 EEST 2012
  • Tue 03 tháng 7 10:32:35 EEST 2012
  • Tue Jul 03 10:32:35 EEST 2012
  • Tue Jul 03 10:32:36 EEST 2012
  • Tue Jul 03 10:32:36 EEST 2012 ...

Tuy nhiên trên một máy khác, dấu thời gian trên bàn điều khiển hiển thị ScheduledThreadPoolExecutor sắp bị trễ. Bằng việc cuối tôi muốn nói một vài giây :)

  • Tue 03 tháng 7 10:32:34 EEST 2012
  • Tue 03 tháng 7 10:32:37 EEST 2012
  • Tue 03 tháng 7 10:32: 40 EEST 2012
  • Tue 03 tháng 7 10:32:44 EEST 2012
  • Tue 03 tháng 7 10:32:50 EEST 2012
  • Tue 03 tháng 7 10:32:55 EEST 2012 ...

tin chi tiết của máy đầu tiên trên đó mã chạy thành công:

i3 Windows 7 64 bit JRE 1.6.0.30

chi tiết của máy thứ hai mà lịch trình chạy cuối:

Dual Core Windows XP 32 bit JRE 1.6.0.18

Tôi tự hỏi tại sao có sự khác biệt như vậy. Bất kỳ đề xuất ?

Xin cảm ơn trước.

+1

Bạn có thể cung cấp thêm chi tiết về môi trường (os, jvm) không? – assylias

+0

Lập lịch sử dụng các cuộc gọi hệ thống cấp hệ điều hành để thực hiện sự chậm trễ, do đó nếu điều này là sai, bạn có vấn đề ở mức độ thấp. –

+2

Bạn ít nhất có thể sử dụng tổng số CPU sử dụng của hai máy chủ. –

Trả lời

1

trên thực tế, lịch hẹn giờ không chính xác, nó tính thời gian bằng bọ cpu. vì vậy nếu tải máy của bạn quá nặng, có thể có sự chậm trễ. kiểm tra tải của máy thứ hai của bạn!

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