2013-05-18 34 views
7

Các bài viết trên trang web liên quan đến Bộ hẹn giờ nói về cách sử dụng Bộ hẹn giờ để lập trình.Java Timer được máy tính thực hiện như thế nào?

Tôi đặt một câu hỏi khác. Java thực hiện phương pháp hẹn giờ như thế nào?

Vì nó được sử dụng để tránh thời gian hiện tại là thời gian cần thiết, tôi nghĩ Timer không được thực hiện đơn giản bằng cách sử dụng vòng lặp liên tục để kiểm tra và so sánh hiện tại thời gian đến thời điểm mong muốn.

Cảm ơn bạn!

+2

1. Vào [OpenJDK nguồn repo] (http://hg.openjdk.java.net/); 2. Tìm câu trả lời; 3. ???; 4. Lợi nhuận. – TC1

+0

Lợi nhuận? Nó có nghĩa là gì? – user1914692

+1

Đây là một tham chiếu đến điều này: http://www.youtube.com/watch?v=tO5sxLapAts –

Trả lời

1

Theo cho javadoc

Lớp này không cung cấp đảm bảo thời gian thực: nó lịch trình nhiệm vụ bằng cách sử dụng phương pháp Object.wait (dài).

Nếu bạn nhìn vào mã, bạn sẽ tìm thấy một phương pháp gọi là vòng lặp chính. Hai dòng đầu tiên được sao chép dưới đây.

private void mainLoop() { 
    while (true) { 
     try { 

Và ... nó sử dụng vòng lặp while bên trong nó cùng với Object.wait() để chờ.

+0

Cảm ơn. Vậy thì Object.wait() đã được triển khai như thế nào? Tôi vẫn giả sử nó không sử dụng trong khi vòng lặp – user1914692

+0

'Object.wait()' là một phương thức "được xây dựng sẵn" được thực hiện trong mã gốc, chứ không phải trong Java, nó sử dụng các cơ sở của hệ điều hành bên dưới để tạm ngừng thực hiện một luồng (do đó, trình lên lịch của hệ điều hành sẽ không cung cấp cho nó bất kỳ thời gian CPU nào) –

+0

Cảm ơn bạn rất nhiều! Đây là những gì tôi nghĩ. Sau đó, làm thế nào để hệ điều hành thực hiện nó mà không có chi phí của CPU? Bất kỳ liên kết để tôi có thể tìm thấy tài liệu tham khảo? – user1914692

2

Tôi nghĩ Bộ hẹn giờ không được thực hiện đơn giản bằng cách sử dụng vòng lặp while để liên tục kiểm tra và so sánh thời gian hiện tại với thời gian mong muốn.

CÓ, IT IS. Tối ưu hóa duy nhất là; nó đang sử dụng hàng đợi ưu tiên dựa trên nextExecutionTime cho các tác vụ.

bang javadoc

đối tượng Timer là một sợi nền duy nhất được sử dụng để thực hiện tất cả các nhiệm vụ của bộ đếm thời gian, theo tuần tự. Các tác vụ hẹn giờ nên hoàn thành nhanh chóng. Nếu tác vụ hẹn giờ mất quá nhiều thời gian để hoàn thành, nó "hogs" chuỗi thực hiện tác vụ của trình hẹn giờ. Điều này có thể, đến lượt nó, trì hoãn việc thực hiện các nhiệm vụ tiếp theo

lớp Timer chứa

  1. TaskQueue mà là một hàng đợi ưu tiên của TimerTasks, lệnh trên nextExecutionTime.
  2. TimerThread(queue) chuỗi thực hiện tác vụ của bộ hẹn giờ, chờ đợi (queue.wait()) cho các tác vụ trên hàng đợi hẹn giờ.

TimerThreadprivate void mainLoop() {
nơi liên tục while(true) sẽ liên tục kiểm tra các nhiệm vụ bằng cách so sánh với nextExecutionTimecurrentTimeMillis

    currentTime = System.currentTimeMillis(); 
        executionTime = task.nextExecutionTime; 
        if (taskFired = (executionTime<=currentTime)) { 

và nếu nó đạt đến sau đó gọi

  if (taskFired) // Task fired; run it, holding no locks 
       task.run(); 
+0

nếu Java Timer sử dụng vòng lặp, sau đó bộ hẹn giờ chính xác như thế nào? – user1914692

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