notifyAll和wait方法是用來進行線程間通信的。
當一個線程調用wait方法時,它會釋放對象的鎖,并進入等待狀態,直到其他線程調用notifyAll方法來喚醒它。
下面是一個簡單的示例代碼,演示了notifyAll和wait方法的配合使用:
public class Message {
private String message;
public synchronized void setMessage(String message) {
this.message = message;
notifyAll();
}
public synchronized String getMessage() {
while (message == null) {
try {
wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
return message;
}
}
public class Main {
public static void main(String[] args) {
Message message = new Message();
Runnable sender = () -> {
message.setMessage("Hello from sender!");
};
Runnable receiver = () -> {
String receivedMessage = message.getMessage();
System.out.println("Received message: " + receivedMessage);
};
Thread senderThread = new Thread(sender);
Thread receiverThread = new Thread(receiver);
senderThread.start();
receiverThread.start();
}
}
在上面的示例中,Message類有一個消息字段和setMessage、getMessage方法。sender線程通過調用setMessage方法來設置消息,receiver線程通過調用getMessage方法來獲取消息。當receiver線程調用getMessage方法時,如果消息字段為null,它會調用wait方法進入等待狀態,直到sender線程調用setMessage方法設置消息并調用notifyAll方法來喚醒receiver線程。
在實際應用中,notifyAll和wait方法通常會和synchronized關鍵字一起使用,以確保線程安全。此外,notifyAll方法會喚醒所有等待的線程,而不是喚醒一個特定的線程。