📅  最后修改于: 2023-12-03 14:42:23.358000             🧑  作者: Mango
在多线程应用程序中,线程之间的同步是非常重要的。Java为开发人员提供了一些机制来实现线程同步,Javanotify()方法就是其中之一。
Javanotify()方法被定义在Object类中,它用于唤醒正在等待此对象监视器的单个线程。如果有多个线程等待,则只会有一个线程继续执行,其他线程将继续等待。
以下是notify()方法的语法:
public final void notify()
notify()方法应该在同步块中使用,因为它需要获得对象的监视器才能正常工作。如果notify()方法不在同步块中被调用,将抛出IllegalMonitorStateException异常。
下面的示例演示了如何在Java程序中使用notify()方法,其中主线程和两个工作线程共享一个对象,并通过notify()方法进行线程通信。
class Message {
private String message;
public Message(String message) {
this.message = message;
}
public String getMessage() {
return message;
}
public void setMessage(String message) {
this.message = message;
}
}
class Waiter implements Runnable {
private Message message;
public Waiter(Message message) {
this.message = message;
}
public void run() {
synchronized (message) {
try {
System.out.println(Thread.currentThread().getName() + " waiting to get notified at time:" + System.currentTimeMillis());
message.wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println(Thread.currentThread().getName() + " waiter thread got notified at time:" + System.currentTimeMillis());
System.out.println(Thread.currentThread().getName() + " processed: " + message.getMessage());
}
}
}
class Notifier implements Runnable {
private Message message;
public Notifier(Message message) {
this.message = message;
}
public void run() {
System.out.println(Thread.currentThread().getName() + " started");
try {
Thread.sleep(1000);
synchronized (message) {
message.setMessage(Thread.currentThread().getName() + " Notifier working");
message.notify();
}
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
public class JavanotifyExample {
public static void main(String[] args) {
Message message = new Message("Process it");
Waiter waiter1 = new Waiter(message);
new Thread(waiter1, "waiter1").start();
Waiter waiter2 = new Waiter(message);
new Thread(waiter2, "waiter2").start();
Notifier notifier = new Notifier(message);
new Thread(notifier, "notifier").start();
System.out.println("All threads started");
}
}
在此示例中,Waiter和Notifier线程共享Message对象。Waiter线程在同步块中使用wait()方法等待通知,并在收到通知后继续执行。Notifier线程在同步块中使用notify()方法来通知等待的线程。
这里我们使用了两个Waiter线程来演示notify()方法如何唤醒某个线程。Output:
All threads started
waiter1 waiting to get notified at time:1473902562884
waiter2 waiting to get notified at time:1473902562884
notifier started
notifier finished
waiter1 waiter thread got notified at time:1473902563887
waiter1 processed: notifier Notifier working
waiter2 waiter thread got notified at time:1473902563888
waiter2 processed: notifier Notifier working
如上所述,waiter1和waiter2线程被notify()方法唤醒,并继续执行。然后两个线程都同时处理相同的消息。
Javanotify()方法提供了一种可靠的线程通信机制,可以确保多个线程在同步块中协调工作。但是请注意,如果使用不当,它可能导致死锁和其他线程问题。所以在使用notify()方法时请谨慎。