Trong Java, cả hai phương thức sleep()
và wait()
đều liên quan đến việc tạm dừng hoạt động của một luồng (thread), nhưng chúng được sử dụng trong các ngữ cảnh và tình huống khác nhau. Dưới đây là sự so sánh chi tiết về hai phương thức này.
sleep()
Phương thức sleep()
thuộc lớp Thread
và được sử dụng để tạm dừng (pause) một luồng trong một khoảng thời gian cố định.
sleep()
:Thread.sleep(milliseconds);
try { Thread.sleep(2000); // Luồng hiện tại sẽ dừng trong 2 giây (2000ms) } catch (InterruptedException e) { e.printStackTrace(); }
sleep()
:sleep()
không yêu cầu luồng phải giữ bất kỳ khóa nào trước khi gọi. Điều này có nghĩa là nó không ảnh hưởng đến các khóa của các đối tượng (synchronized locks).sleep()
, luồng chỉ tạm dừng mà vẫn giữ các khóa của các đối tượng đồng bộ (synchronized).sleep()
chỉ tạm dừng luồng đang thực thi và không ảnh hưởng đến các luồng khác.sleep()
ném InterruptedException
, do đó bạn phải xử lý ngoại lệ này khi sử dụng phương thức.wait()
Phương thức wait()
thuộc lớp Object
và được sử dụng để tạm dừng luồng hiện tại cho đến khi nhận được một thông báo (notify()
hoặc notifyAll()
) từ một luồng khác hoặc khi thời gian chờ hết hạn (nếu có thời gian chờ).
wait()
:wait()
thường được sử dụng trong các tình huống đồng bộ hóa khi một luồng muốn chờ đợi một điều kiện nhất định trước khi tiếp tục. Một luồng sẽ gọi wait()
khi nó không thể tiến hành xử lý do chưa có tài nguyên hoặc dữ liệu mong muốn, và chỉ tiếp tục khi được thông báo bởi một luồng khác.synchronized(object) { object.wait(); }
synchronized(obj) { try { obj.wait(); // Luồng sẽ chờ đến khi obj.notify() hoặc obj.notifyAll() được gọi } catch (InterruptedException e) { e.printStackTrace(); } }
wait()
:wait()
chỉ có thể được gọi bên trong một khối đồng bộ hóa (synchronized block
), và luồng phải giữ khóa của đối tượng trước khi gọi wait()
.wait()
được gọi, luồng sẽ nhả khóa của đối tượng mà nó đang giữ để cho phép các luồng khác truy cập đối tượng này.notify()
hoặc notifyAll()
trên đối tượng mà luồng này đang chờ.wait()
chủ yếu được sử dụng trong các tình huống khi một luồng cần đợi điều kiện hoặc sự kiện nào đó trước khi tiếp tục thực thi.wait()
cũng ném InterruptedException
, do đó cần phải xử lý ngoại lệ này khi sử dụng phương thức.sleep()
và wait()
Tiêu chí | sleep() | wait() |
---|---|---|
Thuộc lớp | Thread | Object |
Mục đích sử dụng | Tạm dừng luồng trong một khoảng thời gian cụ thể. | Chờ đợi đến khi một điều kiện được thỏa mãn hoặc nhận thông báo từ luồng khác. |
Yêu cầu đồng bộ hóa | Không cần đồng bộ hóa (không yêu cầu khóa). | Phải được gọi trong khối đồng bộ hóa, yêu cầu khóa của đối tượng. |
Giữ hay nhả khóa | Không nhả khóa khi tạm dừng. | Nhả khóa của đối tượng trong khi chờ. |
Thời gian chờ | Tạm dừng trong thời gian xác định và tự động tiếp tục. | Chờ đến khi nhận được notify() /notifyAll() hoặc hết thời gian chờ. |
Bản chất | Làm cho luồng hiện tại dừng hoạt động trong một khoảng thời gian cố định. | Được sử dụng để đồng bộ hóa giữa các luồng. |
Chặn luồng hiện tại | Chỉ chặn luồng đang gọi sleep() . | Chặn luồng hiện tại và đợi thông báo từ luồng khác. |
sleep()
và wait()
?sleep()
: Khi bạn cần tạm dừng một luồng trong một khoảng thời gian cố định mà không cần chờ điều kiện nào khác. Ví dụ, bạn muốn tạm dừng một luồng để tránh sử dụng quá nhiều tài nguyên hệ thống.wait()
: Khi bạn cần đồng bộ hóa giữa các luồng và một luồng cần chờ dữ liệu hoặc điều kiện từ một luồng khác trước khi tiếp tục. Thường sử dụng trong các tình huống như producer-consumer, nơi một luồng sản xuất dữ liệu và một luồng tiêu thụ dữ liệu.Phương thức sleep()
và wait()
có chức năng tạm dừng luồng nhưng được sử dụng trong các ngữ cảnh hoàn toàn khác nhau. sleep()
tạm dừng luồng trong một khoảng thời gian xác định mà không cần điều kiện đồng bộ, trong khi wait()
thường được sử dụng trong các cơ chế đồng bộ giữa các luồng, và luồng chỉ tiếp tục khi nhận được thông báo từ luồng khác.