在Java中,可以使用wait()和notify()/notifyAll()方法來解決線程等待的并發(fā)問題。這些方法都是Object類的方法,因此任何Java對(duì)象都可以調(diào)用這些方法。
wait()方法會(huì)使當(dāng)前線程進(jìn)入等待狀態(tài),并釋放對(duì)象的鎖,直到被notify()或notifyAll()方法喚醒。調(diào)用wait()方法的線程會(huì)進(jìn)入對(duì)象的等待隊(duì)列中,等待被喚醒。
而notify()方法會(huì)隨機(jī)喚醒在對(duì)象的等待隊(duì)列中等待的一個(gè)線程,而notifyAll()方法會(huì)喚醒所有在對(duì)象的等待隊(duì)列中等待的線程。這樣可以在多線程環(huán)境中協(xié)調(diào)線程的執(zhí)行順序,避免出現(xiàn)競(jìng)爭(zhēng)條件和死鎖等并發(fā)問題。
下面是一個(gè)簡(jiǎn)單的示例代碼,演示了如何使用wait()和notify()方法來解決線程等待的并發(fā)問題:
public class ThreadWaitExample {
public static void main(String[] args) {
final Object lock = new Object();
Thread t1 = new Thread(new Runnable() {
public void run() {
synchronized(lock) {
try {
System.out.println("Thread 1 is waiting...");
lock.wait();
System.out.println("Thread 1 is notified.");
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
});
Thread t2 = new Thread(new Runnable() {
public void run() {
synchronized(lock) {
try {
System.out.println("Thread 2 is notifying...");
lock.notify();
} catch (Exception e) {
e.printStackTrace();
}
}
}
});
t1.start();
t2.start();
}
}
在這個(gè)例子中,t1線程調(diào)用了lock.wait()方法進(jìn)入等待狀態(tài),而t2線程調(diào)用了lock.notify()方法喚醒了t1線程。通過這種方式,可以實(shí)現(xiàn)線程之間的協(xié)調(diào)和同步,避免出現(xiàn)并發(fā)問題。