<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>

                ??一站式輕松地調用各大LLM模型接口,支持GPT4、智譜、豆包、星火、月之暗面及文生圖、文生視頻 廣告
                [TOC] <br/> > ### `wait/notify` * 等待/通知的相關方法是任意Java對象都具備的,因為這些方法被定義在所有對象的超類`java.lang.Object`上。 ![](https://i.loli.net/2019/03/10/5c851dd4b9ff0.png) * 使用`wait()`、`notify()`和`notifyAll()`時需要先對調用對象加鎖。 * 調用`wait()`方法后,線程狀態由`RUNNING`變為`WAITING`,并將當前線程放置到對象的等待隊列。 * `notify()`或`notifyAll()`方法調用后,等待線程依舊不會從`wait()`返回,需要調用`notify()`或`notifAll()`的線程釋放鎖之后,等待線程才有機會從`wait()`返回。 * `notify()`方法將等待隊列中的一個等待線程從等待隊列中移到同步隊列中,而`notifyAll()`方法則是將等待隊列中所有的線程全部移到同步隊列,被移動的線程狀態由`WAITING`變為`BLOCKED`。 * 從`wait()`方法返回的前提是獲得了調用對象的鎖。 <br/> > ### `sleep`和`wait`的區別 * `sleep`是`Thread`類的方法,`wait`是`Object`類中定義的方法 * `Thread.sleep`不會導致鎖行為的改變,如果當前線程是擁有鎖的,那么`Thread.sleep`不會讓線程釋放鎖。和鎖相關的方法都定義在`Object`類中,因此調用`Thread.sleep`是不會影響鎖的相關行為。 * `wait`必須在`synchronized`塊中。`wait`執行時會釋放對象鎖,通過使用`notify`或者`notifyAll`來喚醒 <br/> > ### 等待/通知的經典范式 * 等待方遵循如下原則 * 1)獲取對象的鎖。 * 2)如果條件不滿足,那么調用對象的wait()方法,被通知后仍要檢查條件。 * 3)條件滿足則執行對應的邏輯。 ``` synchronized(對象) { while(條件不滿足) { 對象.wait(); } 對應的處理邏輯 } ``` * 通知方遵循如下原則 * 1)獲得對象的鎖。 * 2)改變條件。 * 3)通知所有等待在對象上的線程。 ``` synchronized(對象) { 改變條件對象.notifyAll(); } ``` <br/> > ### 兩個線程交替輸出奇偶數到100`synchronized` `wait/notify` ``` public class Demo1 { //兩線程共享的變量 static int i = 1; public static class ThreadDemo implements Runnable{ Object lock; public ThreadDemo(Object lock) { this.lock = lock; } public void run() { synchronized(lock){ while(i <= 100){ System.out.println(Thread.currentThread().getName() + ":" + i); i++; lock.notify(); try { lock.wait(); } catch (InterruptedException e) { e.printStackTrace(); } } } } } public static void main(String[] args) { Object lock = new Object(); Thread t1 = new Thread(new ThreadDemo(lock), "thread1"); Thread t2 = new Thread(new ThreadDemo(lock), "thread2"); t1.start(); t2.start(); } } ``` <br/> > ### 三個線程交替輸出數字到100`synchronized` `wait/notify` ``` public class Demo2{ static int i = 1; static class ThreadDemo implements Runnable{ Object lock; int t; public ThreadDemo(Object lock, int t){ this.lock = lock; this.t = t; } public void run(){ synchronized(lock){ while(i <= 100){ if(i % 3 == t){ System.out.println(Thread.currentThread().getName() + ":" + i); i++; lock.notifyAll(); }else{ try { lock.wait(); } catch (InterruptedException e) { e.printStackTrace(); } } } } } } public static void main(String[] args) { Object lock = new Object(); for(int i = 0; i < 3; i++){ Thread t = new Thread(new ThreadDemo(lock, i), "thread" + (i + 1)); t.start(); } } } ```
                  <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>

                              哎呀哎呀视频在线观看