2011-01-28 10 views
6

thể trùng lặp:
Are Thread.sleep(0) and Thread.yield() statements equivalent?Sự khác nhau giữa Thread.yield() và Thread.sleep (0) trong Java là gì?

Trong hiểu biết của tôi, cả hai Thread.yield() và Thread.sleep (0) nên làm cho rejudge CPU mà thread để chạy bởi một số thuật toán lập lịch trình .

Sự khác biệt là:

  1. Thread.yield() là để cung cấp cho các cơ hội điều hành cho chủ đề khác, nhưng Thread.sleep (0) sẽ không, nó sẽ chỉ nói với CPU mà bạn nên sắp xếp lại các chuỗi điều hành bao gồm cả chuỗi hiện tại.

  2. Thread.yield() chỉ là một lời khuyên có nghĩa là nó có thể không được chấp nhận, nhưng Thread.sleep (0) sẽ thực hiện sắp xếp lại một cách bắt buộc.

Hai kết luận trên có đúng không?

+1

Vì những phương pháp này rất phụ thuộc vào việc triển khai thực hiện nên rất khó để nói. Bạn không nên dựa vào hành vi của các phương pháp này. ví dụ nếu bạn có một vòng lặp mà chỉ Thread.yield() nó sẽ không từ bỏ CPU 99% + thời gian. Thread.sleep (0) có thể ngủ từ 0,5 đến 2 ms tùy thuộc vào hệ điều hành, từ bỏ CPU, nhưng điều này cũng không phải là sự bảo đảm. –

Trả lời

-3

Thread.sleep() sẽ chỉ tạm dừng chuỗi và không cho kiểm soát. Thread.yield() sẽ tạm dừng luồng và cho phép các luồng khác chạy. Nếu không có chủ đề nào cần, chuỗi ban đầu sẽ tiếp tục ngay lập tức.

+3

Sai, tôi nghĩ vậy. Thread.sleep() sẽ đưa Thread ra khỏi trạng thái Running, và cho phép Scheduler chuyển đổi một Runnable Thread thành Running (như Thread.yield()). Tuy nhiên, Thread vẫn giữ bất kỳ khóa nào mà nó nắm giữ. –

2

Thread.Sleep() có chi phí cao hơn một chút vì nó tạo hệ thống bao gồm một số loại bộ hẹn giờ sẽ đánh thức quy trình. (Tùy thuộc vào thực hiện về cơ bản)
Tóm lại, cuối cùng nó sẽ gọi Yield().

Thread.Yield() Chỉ cần từ bỏ lượt của sợi và lấy nó ở vòng tiếp theo.

Thread.Sleep(0) có thể có tối ưu hóa để chỉ gọi sản lượng. (Một lần nữa, thực hiện)