java 如何阻塞线程
阻塞线程的方法
在Java中,可以通过多种方式实现线程的阻塞。以下是几种常见的方法:
使用 Thread.sleep()
Thread.sleep() 方法可以让当前线程暂停执行指定的时间(毫秒)。线程在休眠期间不会释放锁。
try {
Thread.sleep(1000); // 阻塞1秒
} catch (InterruptedException e) {
e.printStackTrace();
}
使用 Object.wait()
Object.wait() 方法会让当前线程进入等待状态,直到其他线程调用 notify() 或 notifyAll()。调用 wait() 前必须持有对象的锁。

synchronized (lockObject) {
try {
lockObject.wait(); // 释放锁并阻塞
} catch (InterruptedException e) {
e.printStackTrace();
}
}
使用 Lock 和 Condition
java.util.concurrent.locks.Lock 接口提供了更灵活的线程阻塞机制,配合 Condition 可以实现精确的线程控制。
Lock lock = new ReentrantLock();
Condition condition = lock.newCondition();
lock.lock();
try {
condition.await(); // 释放锁并阻塞
} catch (InterruptedException e) {
e.printStackTrace();
} finally {
lock.unlock();
}
使用 BlockingQueue
BlockingQueue 是一种线程安全的队列,当队列为空时,take() 方法会阻塞线程,直到队列中有元素。

BlockingQueue<String> queue = new LinkedBlockingQueue<>();
try {
String item = queue.take(); // 阻塞直到队列非空
} catch (InterruptedException e) {
e.printStackTrace();
}
使用 CountDownLatch
CountDownLatch 是一种同步辅助工具,可以让线程等待直到计数器归零。
CountDownLatch latch = new CountDownLatch(1);
try {
latch.await(); // 阻塞直到计数器为0
} catch (InterruptedException e) {
e.printStackTrace();
}
使用 CyclicBarrier
CyclicBarrier 可以让一组线程互相等待,直到所有线程都到达某个屏障点。
CyclicBarrier barrier = new CyclicBarrier(2);
try {
barrier.await(); // 阻塞直到所有线程到达
} catch (InterruptedException | BrokenBarrierException e) {
e.printStackTrace();
}
使用 Semaphore
Semaphore 通过控制许可证的数量来限制线程的访问,当没有许可证时,线程会被阻塞。
Semaphore semaphore = new Semaphore(1);
try {
semaphore.acquire(); // 阻塞直到获取许可证
} catch (InterruptedException e) {
e.printStackTrace();
}
注意事项
- 使用阻塞方法时,通常需要处理
InterruptedException,以避免线程被意外中断。 - 阻塞期间是否需要释放锁取决于具体的方法,例如
wait()会释放锁,而sleep()不会。






