📜  Javanotify()方法的线程同步与实例(1)

📅  最后修改于: 2023-12-03 14:42:23.358000             🧑  作者: Mango

Javanotify()方法的线程同步与实例

在多线程应用程序中,线程之间的同步是非常重要的。Java为开发人员提供了一些机制来实现线程同步,Javanotify()方法就是其中之一。

Javanotify()方法

Javanotify()方法被定义在Object类中,它用于唤醒正在等待此对象监视器的单个线程。如果有多个线程等待,则只会有一个线程继续执行,其他线程将继续等待。

以下是notify()方法的语法:

public final void notify()

notify()方法应该在同步块中使用,因为它需要获得对象的监视器才能正常工作。如果notify()方法不在同步块中被调用,将抛出IllegalMonitorStateException异常。

Javanotify()方法使用示例

下面的示例演示了如何在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()方法时请谨慎。