<kbd id="afajh"><form id="afajh"></form></kbd>
<strong id="afajh"><dl id="afajh"></dl></strong>
    <del id="afajh"><form id="afajh"></form></del>
        1. <th id="afajh"><progress id="afajh"></progress></th>
          <b id="afajh"><abbr id="afajh"></abbr></b>
          <th id="afajh"><progress id="afajh"></progress></th>

          面試:Java線程有哪幾種狀態(tài),它們之間是如何切換的

          共 3771字,需瀏覽 8分鐘

           ·

          2021-05-15 10:12











          多線程歷來(lái)是面試重災(zāi)區(qū),有時(shí)對(duì)多線程的掌握程度決定了開(kāi)發(fā)者的級(jí)別。想掌握多線程還是需要在實(shí)際工作中多應(yīng)用。
          而實(shí)際上經(jīng)常用多線程開(kāi)發(fā)的開(kāi)發(fā)者并不多。但面試要問(wèn)怎么辦,只能是面向面試來(lái)學(xué)習(xí)。各個(gè)擊破,事半功倍。

          狀態(tài)概述

          今天我們來(lái)聊聊多線程之狀態(tài)。這些狀態(tài)是申明在了 java.lang.Thread.State 的枚舉里。
          for (Thread.State state : Thread.State.values()) {
              System.out.println(state);
          }
          打印結(jié)果:
          NEW
          RUNNABLE
          BLOCKED
          WAITING
          TIMED_WAITING
          TERMINATED
          1. New 初始化狀態(tài)
          2. Runnable 可執(zhí)行狀態(tài),包含Ready狀態(tài)和Running狀態(tài),當(dāng)線程start()方法被調(diào)用,線程處于可被線程調(diào)度器選中執(zhí)行的狀態(tài),就是Ready。待到被執(zhí)行時(shí)就是Running狀態(tài)。等獲得CPU時(shí)間片后變?yōu)檫\(yùn)行中狀態(tài)Running
          3. Waiting  等待被喚醒
          4. Timed waiting 等待一段時(shí)間后自動(dòng)喚醒
          5. Blocked 線程阻塞,等待鎖
          6. Terminated 線程結(jié)束

          狀態(tài)如何切換

          狀態(tài)切換圖:


          • 簡(jiǎn)單狀態(tài)切換 NEW -> RUNNABLE -> TERMINATED
          Thread t1 = new Thread(()->{
              System.out.println("Thread go!");
              try {
                  Thread.sleep(2);
              } catch (InterruptedException e) {
                  e.printStackTrace();
              }

          });

          //NEW
          System.out.println("執(zhí)行new后狀態(tài) 1::" + t1.getState());
          t1.start();
          //RUNNABLE
          System.out.println("執(zhí)行start后狀態(tài) 2::" + t1.getState());
          //等待線程執(zhí)行完畢
          t1.join();
          //TERMINATED
          System.out.println("執(zhí)行join后的狀態(tài) 3::" + t1.getState());

          打印結(jié)果:
          執(zhí)行new后狀態(tài) 1::NEW
          執(zhí)行start后狀態(tài) 2::RUNNABLE
          Thread go!
          執(zhí)行join后的狀態(tài) 3::TERMINATED
          • WAITING & TIMED_WAITING
          Thread t2 = new Thread(() -> {
              LockSupport.park();
              System.out.println("t2 run begin");
              try {
                  //睡眠3s
                  TimeUnit.SECONDS.sleep(3);
              } catch (InterruptedException e) {
                  e.printStackTrace();
              }
          });

          t2.start();
          //主線程睡眠1s
          TimeUnit.SECONDS.sleep(1);
          System.out.println("t2 park:" + t2.getState());//WAITING
          //喚醒t2
          LockSupport.unpark(t2);
          //主線程睡眠1s:確認(rèn)t2被叫醒
          TimeUnit.SECONDS.sleep(1);
          System.out.println("t2 unpark:" + t2.getState());//TIMED_WAITING1
          • Blocked
            final Object o = new Object();
            Thread t3 = new Thread(() -> {
                synchronized (o) {
                    System.out.println("t3 start!");
                }
            });
            
            
            Thread t4 = new Thread(() -> {
                synchronized (o) {
                    try {
                        Thread.sleep(5);
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                    System.out.println("t4 start");
                }
            });
            
            //t4 start拿到鎖
            t4.start();
            
            //主線程睡一秒,保證t4已經(jīng)拿到鎖
            Thread.sleep(1);
            
            //t3 start競(jìng)爭(zhēng)鎖
            t3.start();
            
            Thread.sleep(1);
            System.out.println("t3狀態(tài):" + t3.getState());//Blocked

          總結(jié)

          這個(gè)小知識(shí)點(diǎn)比較簡(jiǎn)單,就不多做解釋。積沙成塔,祝福面試成功。
          學(xué)習(xí)就是今天比昨天進(jìn)步一點(diǎn)點(diǎn),加油Coder!

          有道無(wú)術(shù),術(shù)可成;有術(shù)無(wú)道,止于術(shù)

          歡迎大家關(guān)注Java之道公眾號(hào)


          好文章,我在看??

          瀏覽 45
          點(diǎn)贊
          評(píng)論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報(bào)
          評(píng)論
          圖片
          表情
          推薦
          點(diǎn)贊
          評(píng)論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報(bào)
          <kbd id="afajh"><form id="afajh"></form></kbd>
          <strong id="afajh"><dl id="afajh"></dl></strong>
            <del id="afajh"><form id="afajh"></form></del>
                1. <th id="afajh"><progress id="afajh"></progress></th>
                  <b id="afajh"><abbr id="afajh"></abbr></b>
                  <th id="afajh"><progress id="afajh"></progress></th>
                  狠狠躁日日躁夜夜躁A片无码 | 在线喷水看 | 小黄片软件下载 | 欧美一级精品 | 欧洲色图亚洲色图 |