<ruby id="bdb3f"></ruby>

    <p id="bdb3f"><cite id="bdb3f"></cite></p>

      <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
        <p id="bdb3f"><cite id="bdb3f"></cite></p>

          <pre id="bdb3f"></pre>
          <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

          <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
          <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

          <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                <ruby id="bdb3f"></ruby>

                ThinkChat2.0新版上線,更智能更精彩,支持會話、畫圖、視頻、閱讀、搜索等,送10W Token,即刻開啟你的AI之旅 廣告
                # 生產者消費者案例,使用wait和notify進行線程間的數據通信 之前學習了線程同步的只是,接下來學習一下線程間的通信相關的知識,這里簡單來一個生產者消費者的案例來作為入門,實現效果需為生產者生產一個數字,消費者消費一個數字,代碼如下: ```java public class ProduceConsumerVersion1 { private int i = 1; private final Object LOCK = new Object(); private void produce() { synchronized (LOCK) { System.out.println("P->" + (i++)); } } private void consume() { synchronized (LOCK) { System.out.println("C->" + (i)); } } public static void main(String[] args) { ProduceConsumerVersion1 pc = new ProduceConsumerVersion1(); new Thread(() -> { while (true) { pc.produce(); } }, "P").start(); new Thread(() -> { while (true) { pc.consume(); } }, "C").start(); } ``` 第一版使用兩個線程,一個生產者一個消費者,他們使用同一個鎖,也就是不存在兩個線程同時執行的情況,++的執行次數是不可控的,我們猜測并不是生產一個消費一個,代碼運行效果如下: ![](https://img.kancloud.cn/6f/e2/6fe21a6761d53d21a233b635790df746_843x266.png) 這時候想實現,不停的生產不停的消費同時還要生產一個消費一個,就需要線程間的通信了,第一版因為沒有線程之間的通信協作,對于生產者來說它不知道有人消費了,而對于消費者來說它也不知道有人生產了,接下來我們改進代碼: ```java public class ProduceConsumerVersion2 { private int i = 0; private final Object LOCK = new Object(); /** * 是否已經消費 */ private volatile boolean isProduced = false; public void produce() { synchronized (LOCK) { if (isProduced) { try { LOCK.wait(); } catch (InterruptedException e) { e.printStackTrace(); } } else { System.out.println("P->" + (++i)); LOCK.notify(); isProduced = true; } } } public void consume() { synchronized (LOCK) { if (isProduced) { System.out.println("C->" + i); LOCK.notify(); isProduced = false; } else { try { LOCK.wait(); } catch (InterruptedException e) { e.printStackTrace(); } } } } public static void main(String[] args) { ProduceConsumerVersion2 pc = new ProduceConsumerVersion2(); // 單個生產者、消費者運行程序 new Thread(() -> { while (true) { pc.produce(); } }, "P").start(); new Thread(() -> { while (true) { pc.consume(); } }, "C").start(); } } ``` 運行效果如下: ![](https://img.kancloud.cn/23/28/2328d136290eef23ce430b466cec3196_960x231.gif) 可以看到已經做到我們想要的效果了,生產正不斷的生產,消費者不斷地消費,每次生產一個消費一個,但是實際上當有多個生產者消費者的時候還是會有問題的,這個后面再說,先總結一下wait和notify。 **wait: **調用該方法的線程進入 `WAITING` 狀態,只有等待另外線程的通知或被中斷才會返回,需要注意的 是調用 `wait()`方法后,會釋放對象的鎖。因此,`wai`t 方法一般用在同步方法或同步代碼塊中。 **notify:** `Object` 類中的 `notify()` 方法,喚醒在此對象監視器上等待的單個線程,如果所有線程都在此對象 上等待,則會選擇喚醒其中一個線程,選擇是任意的,并在對實現做出決定時發生,線程通過調 用其中一個 `wait()` 方法,在對象的監視器上等待,直到當前的線程放棄此對象上的鎖定,才能繼 續執行被喚醒的線程,被喚醒的線程將以常規方式與在該對象上主動同步的其他所有線程進行競 爭。類似的方法還有 `notifyAll()` ,喚醒再次監視器上等待的所有線程。
                  <ruby id="bdb3f"></ruby>

                  <p id="bdb3f"><cite id="bdb3f"></cite></p>

                    <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
                      <p id="bdb3f"><cite id="bdb3f"></cite></p>

                        <pre id="bdb3f"></pre>
                        <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

                        <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
                        <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

                        <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                              <ruby id="bdb3f"></ruby>

                              哎呀哎呀视频在线观看