乡下人产国偷v产偷v自拍,国产午夜片在线观看,婷婷成人亚洲综合国产麻豆,久久综合给合久久狠狠狠9

  • <output id="e9wm2"></output>
    <s id="e9wm2"><nobr id="e9wm2"><ins id="e9wm2"></ins></nobr></s>

    • 分享

      3、Thread API的簡(jiǎn)單介紹

       Coder編程 2020-02-29

      1、sleep方法

      public static void sleep(long millis, int nanos) throws InterruptedException 
      public static native void sleep(long millis) throws InterruptedException;

      sleep方法的作用是讓當(dāng)前線程暫停執(zhí)行指定時(shí)間,給執(zhí)行機(jī)會(huì)留給其他線程,但是調(diào)用sleep不會(huì)釋放對(duì)象鎖

      1.1、用TimeUnit代替Thread.sleep

      ??可以使用TimeUnit類代替Thread.sleep,TimeUnit是jdk1.5以后增加的一個(gè)枚舉類,對(duì)sleep方法提供了很好的封裝,可以省去時(shí)間單位的換算。

      思考1:sleep(n)和sleep(0)有什么不同
      ??線程有Runnable和Waiting兩種狀態(tài),Runnable狀態(tài)又包含就緒狀態(tài)和運(yùn)行狀態(tài),當(dāng)調(diào)用sleep(n)時(shí),當(dāng)前線程從運(yùn)行狀態(tài)轉(zhuǎn)為等待狀態(tài),線程被放入等待隊(duì)列,等待定時(shí)器n秒后的中斷事件,當(dāng)?shù)竭_(dá)n秒計(jì)時(shí)時(shí),線程從等待隊(duì)列進(jìn)入到就緒隊(duì)列。需要注意的是等待隊(duì)列里的線程是不參與CPU競(jìng)爭(zhēng)的,而就緒隊(duì)列里的線程才會(huì)參與CPU競(jìng)爭(zhēng);
      ??當(dāng)調(diào)用sleep(0)時(shí),當(dāng)前線程是直接從運(yùn)行狀態(tài)轉(zhuǎn)為就緒狀態(tài)的,即線程直接進(jìn)入到了就緒隊(duì)列,就會(huì)參與CPU競(jìng)爭(zhēng)。當(dāng)然調(diào)用sleep(0)的目的并非真正的讓線程掛起0毫秒,而是在于讓當(dāng)前線程暫時(shí)放棄CPU,給執(zhí)行機(jī)會(huì)留給其它線程,相當(dāng)于一個(gè)讓位動(dòng)作。

      思考2:如何喚醒正在睡眠的線程(sleeping)
      ??調(diào)用Sleep(n)會(huì)使得當(dāng)前線程暫停執(zhí)行指定時(shí)間,線程進(jìn)入等待隊(duì)列,并且不會(huì)釋放對(duì)象鎖,這時(shí)線程狀態(tài)就變?yōu)樽枞麪顟B(tài),如果另外一個(gè)線程調(diào)用被阻塞線程的interrupt方法,那么就可以打斷這種阻塞,并且會(huì)拋出InterruptedException,但是如果線程已經(jīng)是死亡的狀態(tài)了,那么嘗試對(duì)其interrupt就會(huì)被忽略。
      類似Object的wait、Thread的sleep、Thread的join等方法都會(huì)使得線程進(jìn)入阻塞狀態(tài),調(diào)用Thread的interrupt都會(huì)打斷這種阻塞。

      2、currentThread方法

      ??currentThread方法返回的是一個(gè)線程實(shí)例,這個(gè)實(shí)例就是指當(dāng)前代碼正在被哪個(gè)線程調(diào)用的線程實(shí)例,可以通過(guò)這個(gè)方法來(lái)獲取線程的相關(guān)的一些信息,比如線程ID,線程名稱等。

      public static native Thread currentThread();

      3、getId方法

      ??getId方法返回的是線程的ID,這個(gè)線程ID是在線程初始化時(shí)生成的一個(gè)唯一長(zhǎng)整型數(shù)值

      public long getId()

      ??在創(chuàng)建線程的初始化方法里設(shè)置線程ID,生成線程ID的方法是一個(gè)靜態(tài)同步方法,保證了生成ID的唯一性

      private void init(...){
          ...省略...
          // 設(shè)置線程ID
          tid = nextThreadID();
      }    
      // 生成線程ID
      private static synchronized long nextThreadID() {
          return ++threadSeqNumber;
      }

      4、getName方法

      ??getName方法返回的是線程名稱,在創(chuàng)建線程初始化的時(shí)候生成

      public final String getName()
      
      public Thread(Runnable target) {
          init(null, target, "Thread-" + nextThreadNum(), 0);
      }
      
      private static synchronized int nextThreadNum() {
          return threadInitNumber++;
      }

      5、isAlive方法

      ??isAlive是用來(lái)判斷一個(gè)線程是否存活,而判斷一個(gè)線程是否存活在于線程已經(jīng)啟動(dòng)但是還沒(méi)有死亡(也就是線程執(zhí)行完畢)

      public final native boolean isAlive();

      6、interrupt方法

      ??interrupt方法用來(lái)中斷線程可以中斷Object#wait、Thread#join、Thread#sleep等各自的一系列方法,并且會(huì)拋出一個(gè)InterruptedException異常
      當(dāng)調(diào)用上述方法時(shí),會(huì)使得線程進(jìn)入一個(gè)阻塞的狀態(tài),在另一個(gè)線程里調(diào)用某線程的interrupt方法就可以打斷某個(gè)線程的阻塞狀態(tài)。但是打斷并是意味著線程的生命周期已經(jīng)結(jié)束,僅僅是打斷了了這種阻塞的狀態(tài)。被中斷的線程會(huì)拋出InterruptedException異常,這個(gè)異常相當(dāng)于是一個(gè)信號(hào)一樣,通知當(dāng)前線程被打斷了。

      7、interrupted方法與isInterrupted方法

      ??interrupted():用來(lái)判斷當(dāng)前線程是否已經(jīng)中斷,執(zhí)行后具有將狀態(tài)標(biāo)志置為false的功能

      public static boolean interrupted() {
          return currentThread().isInterrupted(true);
      }

      ??isInterrupted():用來(lái)判斷某個(gè)線程是否已經(jīng)中斷,不具有清除狀態(tài)標(biāo)志的功能

      public boolean isInterrupted() {
          return isInterrupted(false);
      }
      
      private native boolean isInterrupted(boolean ClearInterrupted);

      8、join方法

      ??join方法就是主線程中調(diào)用子線程的join方法,主線程會(huì)等待子線程執(zhí)行完畢后,才會(huì)繼續(xù)執(zhí)行。
      ??join方法底層是調(diào)用Object類的wait方法,因此也必須加對(duì)象鎖

      public final synchronized void join(long millis) throws InterruptedException
      public final synchronized void join(long millis, int nanos) throws InterruptedException
      public final void join() throws InterruptedException {
          join(0);
      }

      9、yield方法

      ??調(diào)用yield方法就是暗示線程調(diào)度執(zhí)行器,當(dāng)前線程愿意讓出當(dāng)前處理器的使用,給執(zhí)行機(jī)會(huì)留給其他線程,但是線程調(diào)度執(zhí)行器也可以忽略這個(gè)暗示,說(shuō)白了就是這個(gè)讓出了處理器的線程,可以再次被線程調(diào)度執(zhí)行器選中占有處理器從而繼續(xù)執(zhí)行。

      public static native void yield();

        本站是提供個(gè)人知識(shí)管理的網(wǎng)絡(luò)存儲(chǔ)空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點(diǎn)。請(qǐng)注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購(gòu)買等信息,謹(jǐn)防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請(qǐng)點(diǎn)擊一鍵舉報(bào)。
        轉(zhuǎn)藏 分享 獻(xiàn)花(0

        0條評(píng)論

        發(fā)表

        請(qǐng)遵守用戶 評(píng)論公約

        類似文章 更多