2012-12-25 31 views
5

Ai đó có thể giúp tôi hiểu cách hàm Thread.sleep() được thực hiện không? Một luồng sẽ tiếp tục/tỉnh dậy khi thời gian được chỉ định trôi qua hoặc khi một số luồng khác bị ngắt. Tôi quan tâm đến sự hiểu biết về mẫu thiết kế đằng sau công việc này.Java Thread.sleep() implementation

Chế độ ngủ được cho là không ảnh hưởng đến mức tiêu thụ CPU. Chủ đề hiện tại có được thêm vào danh sách người nghe không? Khi nào thì kiểm tra cờ ngắt xuất hiện? Bộ lập lịch có tiếp tục kiểm tra trạng thái ngắt của mỗi chuỗi đang ngủ trong mỗi khoảng thời gian "x" (dựa trên những gì hệ điều hành hỗ trợ) không? Làm thế nào để các thread có được điều khiển trở lại mà không ảnh hưởng đến CPU.

Tôi đã tìm kiếm nội dung này. Xin lỗi nếu tôi bỏ lỡ bất kỳ liên kết nào dễ tìm.

+0

Nó được thực hiện bởi hệ điều hành, chứ không phải bằng Java. Câu hỏi của bạn thực sự là chủ đề. – EJP

Trả lời

13

Ai đó có thể giúp tôi hiểu cách hàm Thread.sleep() được triển khai không?

Nó gọi sleep trên chuỗi gốc cơ bản do hệ điều hành cung cấp.

Ngủ được cho là không ảnh hưởng đến mức tiêu thụ CPU.

Chủ đề không chạy không tiêu tốn thời gian CPU.

Chủ đề hiện tại có được thêm vào danh sách người nghe không?

số

Khi kiểm tra cho cờ ngắt sẽ xảy ra?

Chủ đề không thể kiểm tra cờ ngắt vì nó không chạy. Hệ điều hành có thể đánh thức luồng nếu được yêu cầu.

Liệu scheduler liên tục kiểm tra cho tình trạng ngắt của mỗi chủ đề đó đang ngủ cho mỗi số tiền "x" thời gian (dựa trên những gì hệ điều hành hỗ trợ)?

số

Làm thế nào để các chủ đề được kiểm soát trở lại mà không thực hiện việc CPU.

Chuỗi này sẽ tự động được hệ điều hành đánh thức khi thời gian hết hạn, hoặc một chuỗi khác có thể yêu cầu hệ điều hành đánh thức sớm.


Dưới đây là một số mã đằng sau Thread.sleep() trong OpenJVM:

2811  ThreadState old_state = thread->osthread()->get_state(); 
2812  thread->osthread()->set_state(SLEEPING); 
2813  if (os::sleep(thread, millis, true) == OS_INTRPT) { 
2814  // An asynchronous exception (e.g., ThreadDeathException) could have been thrown on 
2815  // us while we were sleeping. We do not overwrite those. 
2816  if (!HAS_PENDING_EXCEPTION) { 
2817   HS_DTRACE_PROBE1(hotspot, thread__sleep__end,1); 
2818   // TODO-FIXME: THROW_MSG returns which means we will not call set_state() 
2819   // to properly restore the thread state. That's likely wrong. 
2820   THROW_MSG(vmSymbols::java_lang_InterruptedException(), "sleep interrupted"); 
2821  } 
2822  } 
2823  thread->osthread()->set_state(old_state); 
+0

Cảm ơn nhiều. Đó là phần lớn những hiểu lầm của tôi. Tôi chỉ còn một câu hỏi nữa. Khi nào thì InterruptedException được xây dựng? Có chức năng gọi lại nào được thực hiện khi hệ điều hành báo cáo thời gian gián đoạn hoặc hết hạn không? –

+0

@Praneethvarma: Khi chủ đề đánh thức nó có thể kiểm tra lý do tại sao nó bị đánh thức. Tôi đã đăng mã C từ OpenJVM nơi kiểm tra này được thực hiện. –