java如何让线程等待
线程等待的实现方法
在Java中,线程等待可以通过多种方式实现,以下是几种常见的方法:
使用 Object.wait() 方法
调用 wait() 方法使当前线程进入等待状态,直到其他线程调用 notify() 或 notifyAll() 方法唤醒它。需要注意的是,wait() 必须在同步块或同步方法中调用。
synchronized (lockObject) {
try {
lockObject.wait(); // 线程进入等待状态
} catch (InterruptedException e) {
Thread.currentThread().interrupt();
}
}
使用 Thread.sleep() 方法
sleep() 方法使当前线程暂停执行指定的时间,但不会释放锁。适用于需要延迟执行的场景。
try {
Thread.sleep(1000); // 线程休眠1秒
} catch (InterruptedException e) {
Thread.currentThread().interrupt();
}
使用 CountDownLatch
CountDownLatch 是一个同步辅助类,允许一个或多个线程等待其他线程完成操作。
CountDownLatch latch = new CountDownLatch(1);
// 等待线程
new Thread(() -> {
try {
latch.await(); // 等待计数器归零
} catch (InterruptedException e) {
Thread.currentThread().interrupt();
}
}).start();
// 触发线程
new Thread(() -> {
latch.countDown(); // 计数器减1
}).start();
使用 CyclicBarrier
CyclicBarrier 允许一组线程互相等待,直到所有线程都到达某个屏障点。
CyclicBarrier barrier = new CyclicBarrier(2);
new Thread(() -> {
try {
barrier.await(); // 等待其他线程到达
} catch (Exception e) {
e.printStackTrace();
}
}).start();
使用 Semaphore
Semaphore 用于控制同时访问特定资源的线程数量,通过 acquire() 和 release() 方法实现线程等待和释放。
Semaphore semaphore = new Semaphore(0);
new Thread(() -> {
try {
semaphore.acquire(); // 等待许可
} catch (InterruptedException e) {
Thread.currentThread().interrupt();
}
}).start();
new Thread(() -> {
semaphore.release(); // 释放许可
}).start();
注意事项
- 使用
wait()和notify()时,必须确保在同步块中调用,以避免IllegalMonitorStateException。 sleep()不会释放锁,而wait()会释放锁。- 高并发场景下,
CountDownLatch和CyclicBarrier比wait()和notify()更易用且安全。 - 避免在循环中直接调用
sleep()或wait(),可能导致性能问题或死锁。







