<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] ## 1. sleep 1. wait,sleep,join,I/O導致的block,會被interrupted方法中斷. 2. 這些可中斷方法,在捕捉到中斷信號后,也就是捕獲了InterruptedException異常,就會擦出interrupt標識。 ![](https://img.kancloud.cn/5e/25/5e25031c64ea05891284fe4d5cf47d50_1018x262.png) 因為捕獲到了信號,所以標識被擦出,輸出false ## 1.1 特性 1、使線程進入執行時間的休眠 2、不會放棄monitor鎖的所有權 ## 1.2 TimeUnit ### 1.2.1 省去換算,表達清晰 是一個枚舉類,對sleep進行了很好的封裝,并省去了時間換算的過程。例如使線程休眠4分15秒 1、以前的寫法是 ~~~ Thread.sleep(4*60*1000 + 15 * 1000); ~~~ 2、TimeUnit省去換算 ,而且清晰 ~~~ TimeUnit.MINUTES.sleep(4); TimeUnit.SECONDS.sleep(15); ~~~ ### 1.2.2 時間不同單位之間的換算 TimeUnit還提供了便捷方法用于把時間轉換成不同單位,例如,如果你想把秒轉換成毫秒,你可以使用下面代碼: ~~~ TimeUnit.SECONDS.toMillis(129) ~~~ TimeUnit更加強大,在需要使用sleep的時候,建議使用TimeUnit ## 2. yield ### 2.1 特性 yield屬于一種啟發式的方法,會提箱調度器表示當前線程原因放棄cpu資源,如果cpu資源不緊張,則會忽略這種題型。 ## 3. yield于sleep 1、sleep只是暫時停止,沒有時間片的消耗 2、yield執行后,如果調度器沒有忽略這個提示,則會導致上下文切換。 3、sleep可以捕捉到interrupt信號,yield不能 ### 3.1 wait和sleep的區別 一、wait特性: 1. 線程調用了某個對象的wait方法后,都會放入該對象monitor相關聯的wait set 中,并釋放monitor的所有權! 2. notify喚醒wait set中的一個thread,notifyall喚醒wait set中所有的阻塞線程,喚醒后仍需要爭奪鎖 二、wait和sleep的區別 1、wait是Object類的方法,所有類都有這個方法,sleep是Thread特有的方法 2、wait必須持有對象的monitor鎖,也是就說wait必須在同步方法中執行 3、wait會釋放鎖,sleep不會釋放鎖 4、wait需要在同步方法中執行,sleep不需要。而且要求執行wait的方法和同步所用的鎖關聯對象是同一個。 ![](https://img.kancloud.cn/d3/f4/d3f41fb67920a455a156491bc08bf93d_635x302.png) 同步對象是this,但是調用MUTEX的wait方法,此時會拋出IllegalMonitorStateException! ### 3.2 wait和sleep的相同點 1、sleep和wait都是可中斷方法,被打斷后,都會收到中斷異常InterruptdException,同時擦除interrupt標識 ## 4. interrupt ### 4.1 interrupt特性 1、只對由于wait,sleep,join等造成阻塞的線程起作用!對于沒有阻塞的線程 不起作用 2、interrupt和stop不同的是,它不會終止整個線程,而是終止Object.wait, Thread.join和Thread.sleep三種方法造成的阻塞狀態,果在調用它時,線程處于阻塞狀態了,調用interrupt會拋出InterruptedException 3、打斷一個線程并不是線程的生命周期的結束,而是打斷了線程的阻塞狀態 ~~~ package com.tuna.test.thread; public class InterruptThread1 extends Thread { public static void main(String[] args) { InterruptThread1 t = new InterruptThread1(); t.start(); try { Thread.sleep(1000); t.interrupt(); } catch (InterruptedException e) { e.printStackTrace(); } } @Override public void run() { for (int i = 0; i <= 200000; i++) { try { Thread.sleep(2000); System.out.println("i=" + i); } catch (InterruptedException e) { e.printStackTrace(); } } } } ~~~ 如下輸出,中斷異常后,不會影響線程的繼續執行 ``` java.lang.InterruptedException: sleep interrupted at java.lang.Thread.sleep(Native Method) at com.tuna.test.thread.InterruptThread1.run(InterruptThread1.java:21) i=1 i=2 i=3 i=4 i=5 ... ``` **執行interrupted方法和可中斷方法攔截InterruptedException后會擦出中斷標記** ### 4.2 實例 ![](https://img.kancloud.cn/8e/4b/8e4ba2c36c0e46bea7cbd2d862f529d9_1160x676.png) 兩毫秒后,主線程打斷子線程的阻塞,子線程捕獲中斷異常,輸出“Oh,i am be interrupted” ### 4.3 interrupt flag 1、每個線程都有一個interrupt flag,當調用線程被interrupt,該標記會被設置 2、當線程調用了可中斷方法進入阻塞時,調用interrupt方法被調用,flag將會被清除,說明線程已經打斷了interrupt狀態(非阻塞),此時調用isInterrupted方法時,返回false。 ### 4.4 判斷線程是否被中斷 1、**isInterrupted** 判斷線程是否被中斷 ![](https://img.kancloud.cn/6a/9e/6a9e8df6605fea08491c68ba0e6489df_1253x631.png) ![](https://img.kancloud.cn/23/6e/236ed52fd94ee9db62efe3d13eaf9a99_611x116.png) **調用sleep可中斷方法,進入阻塞** 第一次輸出,因為沒有被中斷,所以輸出false 第二、三輸出時,線程被中斷,但是**interrupt flag被擦除了**,依然輸出false 2、 **interrupted** 判斷是否被中斷 1)如果線程被打斷了,第一次調用interrupted將返回true,并立即擦除interrupt flag標記 2)第二次及以后調用interrupted都會返回false,除非次線程再一次被打斷 ![](https://img.kancloud.cn/f3/2f/f32fd7dce0cb726e46b7b206e36ce20c_1050x567.png) 子線程不斷輸出,期間main線程打斷了一下子線程,所以會輸出一次true,并且馬上擦擦除標記,繼續輸出 false。 由此看出,**interrupt不會影響非阻塞(可中斷)的線程的繼續執行** ## 5. join 阻塞線程,可中斷 B調用A線程join方法,b進入阻塞,知道A執行完成 ## 6 線程進入runnable狀態 1、阻塞I/O完成,比如網絡i/o完成,進入runnable狀態 2、完成了指定得休眠sleep,進入runnable狀態 3、wait中的線程被其他線程notify/notifyall喚醒,進入runnable狀態 4、獲取到了某個鎖資源,進入runnable狀態 5、線程在阻塞過程中,被其他線程interrupted,進入runnable狀態
                  <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>

                              哎呀哎呀视频在线观看