"Chào, Amigo!"

"Bây giờ tôi sẽ cho bạn biết một chút về các phương pháp ngủ, năng suất và tham gia."

"Thật là nhàm chán. Tôi vừa tìm thấy một câu hỏi phỏng vấn: 'Sự khác biệt giữa các phương thức yield (), sleep () và wait () là gì?'. Bạn có thể giải thích điều đó không?"

"Không thành vấn đề. Đầu tiên, đây là ba phương pháp hoàn toàn khác nhau."

1) ngủ(thời gian chờ)  – dừng luồng hiện tại (trên đó chế độ ngủ được gọi) trong số mili giây được chỉ định bởi tham số thời gian chờ. Chuỗi sau đó chuyển sang trạng thái TIMED_WAITING. Phương thức có thể kết thúc sớm hơn nếu cờ isInterrupted được đặt.

Ví dụ Sự miêu tả
Thread.sleep(500);
Chuỗi hiện tại tạm dừng thực thi của chính nó trong 500 mili giây hoặc 0,5 giây.

2) yield()  – chủ đề hiện tại 'bỏ qua lượt của nó'. Luồng chuyển từ trạng thái đang chạy sang trạng thái sẵn sàng và JVM chuyển sang luồng tiếp theo. Các trạng thái đang chạy và sẵn sàng là các trạng thái con của trạng thái CHẠY ĐƯỢC .

Ví dụ Sự miêu tả
Thread.yield();
Luồng hiện tại "bỏ lượt" và Java ngay lập tức chuyển sang luồng tiếp theo.

3) wait(timeout)  – đây là một phiên bản của phương thức wait (), nhưng có thời gian chờ. " Phương thức chờ chỉ có thể được gọi trong một khối được đồng bộ hóa trên một đối tượng mutex bị khóa bởi luồng hiện tại. Nếu không, phương thức này sẽ ném một Ngoại lệ MonitorState bất hợp pháp .

"Việc gọi phương thức này sẽ giải phóng khóa của đối tượng mutex, khiến nó có sẵn cho một luồng khác lấy. Ngoài ra, luồng sẽ chuyển sang trạng thái CHỜ (đối với phương thức wait() không có tham số) hoặc trạng thái TIMED_WAITING (đối với trạng thái chờ (hết thời gian chờ ) phương pháp)."

Ví dụ Sự miêu tả
Object monitor = getMonitor();
synchronized(monitor)
{
 …
 monitor.wait(500);
 …
}
Khi phương thức chờ được gọi, luồng hiện tại sẽ giải phóng khóa của đối tượng giám sát và ở chế độ ngủ trong 500 mili giây. Đối tượng màn hình có thể được lấy bởi một luồng khác.
Sau 500 mili giây, luồng sẽ thức dậy và nếu màn hình không bận, luồng sẽ tiếp nhận nó và tiếp tục hoạt động.
Nếu màn hình bị khóa bởi luồng khác, luồng hiện tại sẽ chuyển sang trạng thái CHẶN.

4) tham gia (hết thời gian chờ)

"Phương pháp này không có trong câu hỏi của bạn, nhưng nó có trong kế hoạch bài học của tôi, vì vậy tôi sẽ cho bạn biết về nó. Khi bạn gọi phương thức nối () hoặc nối (hết thời gian chờ), luồng hiện tại được 'gắn' vào Chủ đề đã gọi phương thức này. Chuỗi hiện tại chuyển sang chế độ ngủ và đợi cho đến khi chuỗi mà nó được nối kết thúc (tức là chuỗi có phương thức join() được gọi)."

"Chuỗi hiện tại đi vào trạng thái CHỜ đối với phương thức nối() và trạng thái TIMED_WAITING đối với phương thức nối (hết thời gian chờ)."

Ví dụ Sự miêu tả
Thread thread = getWorkThread();
thread.join(500);
Chuỗi hiện tại sẽ tham gia chuỗi workerThread và đợi nó kết thúc.
Nhưng nó sẽ 'không tham gia' sau 500 mili giây và tiếp tục chạy.

"Thời gian chờ trong các phương thức chờ (hết thời gian chờ) và tham gia (hết thời gian chờ) có nghĩa là phương thức chuyển sang chế độ ngủ và chờ một thứ gì đó, nhưng không lâu hơn thời gian chờ tính bằng mili giây. Sau đó, nó sẽ thức dậy."

"Có vẻ như điểm chung duy nhất của các phương pháp này là thời gian chờ. Chúng làm những việc hoàn toàn khác nhau."

"Ừ, đúng vậy."