安卓 Thread wait notify使用
时间: 2023-09-18 11:08:55 浏览: 61
Thread wait和notify方法是Java中用于线程同步的重要方法,可以实现线程之间的协作和通信。wait方法会使当前线程进入等待状态,直到其他线程调用notify方法唤醒它;而notify方法则会随机唤醒一个正在等待的线程。在Android开发中,Thread wait和notify方法可以用于处理异步任务的结果回调、UI线程和后台线程的通信等场景。具体的使用方法可以参考相关的文档和示例代码。
相关问题
wait notify方法原理及使用
`wait()` 和 `notify()` 方法是 Java 中用于线程间通信的两个重要方法。`wait()` 方法用于让线程进入等待状态,并释放锁,而 `notify()` 方法则用于唤醒等待状态的线程。这两个方法必须在同步方法或同步块中使用,否则会抛出 `IllegalMonitorStateException` 异常。
`wait()` 方法的调用会让线程进入等待状态,直到有其他线程调用了同一个对象的 `notify()` 或 `notifyAll()` 方法来唤醒它。在等待期间,线程会释放它持有的锁,以便其他线程可以进入同步块执行。`wait()` 方法可以使用以下两种方式调用:
- `wait()`:让线程一直等待,直到其他线程调用了 `notify()` 或 `notifyAll()` 方法唤醒它。
- `wait(long timeout)`:让线程等待一段时间,如果在等待期间没有其他线程调用 `notify()` 或 `notifyAll()` 方法唤醒它,那么线程会自动醒来。
`notify()` 方法用于唤醒等待状态的线程。它会随机地唤醒一个等待状态的线程,如果有多个线程都在等待同一个对象的锁,那么只有其中一个线程会被唤醒。`notifyAll()` 方法则会唤醒所有等待状态的线程。
以下是一个简单的示例,展示了如何使用 `wait()` 和 `notify()` 方法进行线程间通信:
```java
class MyThread implements Runnable {
private final Object lock;
public MyThread(Object lock) {
this.lock = lock;
}
@Override
public void run() {
synchronized (lock) {
System.out.println("Thread " + Thread.currentThread().getName() + " is waiting");
try {
lock.wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("Thread " + Thread.currentThread().getName() + " is awake");
}
}
}
public class Main {
public static void main(String[] args) throws InterruptedException {
Object lock = new Object();
Thread t1 = new Thread(new MyThread(lock));
Thread t2 = new Thread(new MyThread(lock));
t1.start();
t2.start();
Thread.sleep(1000);
synchronized (lock) {
lock.notify();
}
}
}
```
在这个示例中,我们创建了两个线程 `t1` 和 `t2`,它们都在同一个对象 `lock` 上等待。在主线程中,我们等待 1 秒钟后调用了 `notify()` 方法来唤醒一个等待状态的线程。由于 `notify()` 方法是随机唤醒一个线程,因此我们无法确定哪个线程会被唤醒。在这个示例中,我们可以看到其中一个线程被唤醒并输出了 "Thread X is awake" 的信息。
wait notify可以配合ReentrantLock使用吗
是的,wait()和notify()方法可以与ReentrantLock一起使用,但是需要使用Condition对象来实现。Condition是一种更加灵活的线程通信机制,它可以与Lock实现关联,可以在某个条件满足时通知等待线程。
例如,可以通过以下方式使用ReentrantLock和Condition来实现wait()和notify()的功能:
```java
import java.util.concurrent.locks.Condition;
import java.util.concurrent.locks.ReentrantLock;
public class Example {
private final ReentrantLock lock = new ReentrantLock();
private final Condition condition = lock.newCondition();
private boolean flag = false;
public void produce() throws InterruptedException {
lock.lock();
try {
// 检查标志位,如果已经为true,则等待
while (flag) {
condition.await();
}
// 生产者生产数据
// ...
flag = true;
// 通知消费者可以消费了
condition.signal();
} finally {
lock.unlock();
}
}
public void consume() throws InterruptedException {
lock.lock();
try {
// 检查标志位,如果已经为false,则等待
while (!flag) {
condition.await();
}
// 消费者消费数据
// ...
flag = false;
// 通知生产者可以生产了
condition.signal();
} finally {
lock.unlock();
}
}
}
```
在这个例子中,生产者和消费者共享一个标志位flag,当flag为false时,生产者可以生产数据,而消费者需要等待;当flag为true时,消费者可以消费数据,而生产者需要等待。当生产者生产数据后,通过调用condition.signal()方法通知消费者;当消费者消费数据后,通过调用condition.signal()方法通知生产者。注意,生产者和消费者都需要在获取锁之后才能调用wait()和notify()方法。