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);
Nguồn
2012-12-25 00:39:58
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