Java中的等待和阻塞是指在多線程環境下,一個線程在等待另外一個線程執行完畢或者在某些條件下暫停線程執行的過程。
在Java中,可以使用wait()和notify()兩個方法來實現線程間的等待和喚醒。在使用wait()方法時,線程會釋放它所持有的鎖并進入等待狀態,直到其他線程通過notify()方法來喚醒它。而在使用notify()方法時,會隨機喚醒一個正在等待的線程,從而讓它繼續執行。
public class WaitAndNotifyDemo { private static final Object monitor = new Object(); public static void main(String[] args) { new Thread(() ->{ synchronized (monitor) { System.out.println(Thread.currentThread().getName() + "進入等待狀態"); try { monitor.wait(); } catch (InterruptedException e) { e.printStackTrace(); } System.out.println(Thread.currentThread().getName() + "被喚醒并繼續執行"); } }).start(); try { Thread.sleep(1000); } catch (InterruptedException e) { e.printStackTrace(); } new Thread(() ->{ synchronized (monitor) { System.out.println(Thread.currentThread().getName() + "喚醒等待線程"); monitor.notify(); } }).start(); } }
上面的代碼演示了使用wait()和notify()方法實現線程間的等待和喚醒。當第一個線程執行到wait()方法時,會釋放monitor對象的鎖并進入等待狀態,直到第二個線程執行notify()方法時才會被喚醒。
除了使用wait()和notify()方法外,Java還提供了其他一些方式來實現線程的等待和喚醒,比如使用CountDownLatch、Semaphore、CyclicBarrier等類。
另外,線程還可能遇到阻塞的情況。比如在執行IO操作時,線程會進入阻塞狀態,等待IO操作完成。同樣地,在使用Object類的wait()方法時,如果沒有其他線程來喚醒它,線程也會進入阻塞狀態。
需要注意的是,線程的等待和阻塞都可能導致死鎖的情況。因此,在設計多線程程序時,需要仔細考慮線程間的依賴關系和數據的同步方式,以避免死鎖問題的出現。
上一篇java符號和空格
下一篇JAVA梯形面積和周長