Java wait()和notify()例子
时间: 2023-09-03 13:24:55 浏览: 59
### 回答1:
Java wait()和notify()是用于线程同步的方法。wait()方法使当前线程进入等待状态,直到其他线程调用notify()方法唤醒它。以下是一个简单的例子:
```
public class WaitNotifyExample {
public static void main(String[] args) {
final Object lock = new Object();
Thread t1 = new Thread(new Runnable() {
public void run() {
synchronized (lock) {
System.out.println("Thread 1 is waiting");
try {
lock.wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("Thread 1 is awake");
}
}
});
Thread t2 = new Thread(new Runnable() {
public void run() {
synchronized (lock) {
System.out.println("Thread 2 is running");
lock.notify();
}
}
});
t1.start();
t2.start();
}
}
```
在这个例子中,线程1先获得锁并进入等待状态,线程2获得锁后调用notify()方法唤醒线程1,线程1继续执行。
### 回答2:
在Java中,wait()和notify()是用于实现线程间通信的两个关键方法。当一个线程调用了某个对象的wait()方法后,它会释放该对象的锁,并且进入等待状态,直到其他线程调用了该对象的notify()方法为止。
下面举一个简单的例子来说明wait()和notify()的用法。
假设有一个生产者线程和一个消费者线程,它们共享一个队列。生产者线程负责向队列中添加元素,消费者线程负责从队列中取出元素。当队列为空时,消费者线程需要等待生产者线程添加元素;当队列已满时,生产者线程需要等待消费者线程取出元素。
首先,我们需要定义一个队列类,其中包含添加元素、取出元素和判断队列是否为空的方法。
```java
public class Queue {
private int maxSize;
private List<Integer> queue;
public Queue(int maxSize) {
this.maxSize = maxSize;
this.queue = new ArrayList<>();
}
public synchronized void addElement(int element) {
while (queue.size() >= maxSize) {
try {
wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
queue.add(element);
System.out.println("生产者线程添加了元素:" + element);
notify();
}
public synchronized int getElement() {
while (queue.isEmpty()) {
try {
wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
int element = queue.remove(0);
System.out.println("消费者线程取出了元素:" + element);
notify();
return element;
}
public boolean isEmpty() {
return queue.isEmpty();
}
}
```
然后,我们创建一个生产者线程和一个消费者线程,并且它们共享同一个队列。
```java
public class Main {
public static void main(String[] args) {
Queue queue = new Queue(5);
Thread producerThread = new Thread(() -> {
for (int i = 1; i <= 10; i++) {
queue.addElement(i);
}
});
Thread consumerThread = new Thread(() -> {
while (!queue.isEmpty()) {
queue.getElement();
}
});
producerThread.start();
consumerThread.start();
}
}
```
在上述代码中,生产者线程通过调用addElement方法向队列中添加元素,如果队列已满,则调用wait方法使生产者线程进入等待状态。消费者线程通过调用getElement方法从队列中取出元素,如果队列为空,则调用wait方法使消费者线程进入等待状态。
当生产者线程成功添加了一个元素后,会调用notify方法,通知消费者线程可以取出元素。同样地,当消费者线程成功取出了一个元素后,也会调用notify方法,通知生产者线程可以添加新的元素。
通过wait()和notify()方法的使用,生产者线程和消费者线程能够实现有效的协作,确保在队列为空或已满时线程能够正确等待和唤醒,从而保证线程之间的顺序和同步。
### 回答3:
Java中的wait()和notify()是用于线程间通信的方法。wait()方法使当前线程进入等待状态,直到其他线程调用notify()方法来唤醒它。
下面是一个使用wait()和notify()方法的例子:
```java
public class ThreadExample {
public void producer() {
synchronized (this) {
System.out.println("生产者线程开始生产...");
try {
// 等待消费者消费完产品
wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("生产者继续生产...");
}
}
public void consumer() {
try {
Thread.sleep(2000);
} catch (InterruptedException e) {
e.printStackTrace();
}
synchronized (this) {
System.out.println("消费者开始消费...");
// 唤醒生产者线程
notify();
}
System.out.println("消费者继续消费...");
}
public static void main(String[] args) {
ThreadExample example = new ThreadExample();
Thread producerThread = new Thread(new Runnable() {
@Override
public void run() {
example.producer();
}
});
Thread consumerThread = new Thread(new Runnable() {
@Override
public void run() {
example.consumer();
}
});
producerThread.start();
consumerThread.start();
}
}
```
以上是一个简单的生产者-消费者模型。在生产者线程中,使用synchronized关键字对共享对象进行锁定,然后调用wait()方法进入等待状态,直到消费者线程调用notify()方法将其唤醒。消费者线程睡眠2秒,然后使用synchronized关键字锁定共享对象,调用notify()方法唤醒生产者线程。
在运行上面的代码时,我们可以看到生产者线程首先开始运行并进入等待状态。消费者线程等待2秒后唤醒生产者线程,生产者线程继续运行。
这个例子展示了wait()和notify()的基本用法,通过它们可以实现线程间的协调和通信,确保线程能够按照所需的顺序执行。