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
TaskQueue
mà là một hàng đợi ưu tiên của TimerTasks, lệnh trên nextExecutionTime.
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ờ.
TimerThread
có private 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 nextExecutionTime
currentTimeMillis
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();
Nguồn
2014-06-20 18:49:07
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
Lợi nhuận? Nó có nghĩa là gì? – user1914692
Đây là một tham chiếu đến điều này: http://www.youtube.com/watch?v=tO5sxLapAts –