大家好,我是锋哥。今天分享关于 【Java 中你怎样唤醒一个阻塞的线程?】面试题,希望对大家有帮助;
Java 中你怎样唤醒一个阻塞的线程?
在Java中,可以通过以下方式唤醒一个阻塞的线程:
-
使用
Object
类的wait()
和notify()
方法。 -
使用
Condition
接口和Lock
接口来实现更灵活的线程同步。
以下是使用Object
类的wait()
和notify()
方法的例子:
public class WakeUpThreadExample {
private static Object lock = new Object();
public static void main(String[] args) throws InterruptedException {
Thread t = new Thread(new Runnable() {
@Override
public void run() {
synchronized (lock) {
System.out.println("线程启动并阻塞...");
try {
lock.wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("线程被唤醒");
}
}
});
t.start();
Thread.sleep(2000); // 确保线程已经进入阻塞状态
synchronized (lock) {
lock.notify();
System.out.println("已发出唤醒信号");
}
}
}
在这个例子中,我们首先创建了一个名为lock
的对象,它被用作线程之间的同步工具。然后我们启动了一个新线程,在该线程中,我们首先输出一条消息表明线程已启动,然后调用lock.wait()
进入阻塞状态。在主线程中,我们等待2秒来确保新线程已经进入阻塞状态,然后我们调用lock.notify()
唤醒正在等待的线程。
1000道 互联网大厂Java工程师 精选面试题-Java资源分享网
注意,wait()
, notify()
和 notifyAll()
方法只能在同步块或同步方法中被调用,也就是说,调用这些方法的对象必须被当前线程锁定。