小男孩‘自慰网亚洲一区二区,亚洲一级在线播放毛片,亚洲中文字幕av每天更新,黄aⅴ永久免费无码,91成人午夜在线精品,色网站免费在线观看,亚洲欧洲wwwww在线观看

分享

初學(xué)者第62節(jié)之線程優(yōu)先級(jí)和守護(hù)詳解(四)

 太極混元天尊 2018-04-21
Java 猿程之家 
大型互聯(lián)網(wǎng)項(xiàng)目視頻
公告通知

本公眾專注于為廣大Java初學(xué)者和愛(ài)好者以及熱愛(ài)編程的菜鳥(niǎo)提供學(xué)習(xí)交流平臺(tái),共同成長(zhǎng)。 如果您發(fā)現(xiàn)什么錯(cuò)誤、遺漏或不明的地方,可以通過(guò)文章下留言、群內(nèi)討論或私撩小編提出意見(jiàn)反饋,當(dāng)然小編會(huì)給這些奉獻(xiàn)的朋友分享Java 大型互聯(lián)網(wǎng)項(xiàng)目實(shí)戰(zhàn)視頻資料(不定期更新視頻資料) ,希望與大家一同成長(zhǎng)!?。?/span>

一、線程優(yōu)先級(jí)

線程可以劃分優(yōu)先級(jí),優(yōu)先級(jí)分為1-10的10個(gè)等級(jí),數(shù)字越大優(yōu)先級(jí)越高,優(yōu)先級(jí)較高的線程得到CPU資源較多,也就是CPU優(yōu)先執(zhí)行優(yōu)先級(jí)較高的線程對(duì)象中的任務(wù)(其實(shí)并不是這樣)。但是線程的優(yōu)先級(jí)仍然無(wú)法保障線程的執(zhí)行次序。只不過(guò),優(yōu)先級(jí)高的線程獲取CPU資源的概率較大,優(yōu)先級(jí)低的并非沒(méi)機(jī)會(huì)執(zhí)行。

二、優(yōu)先級(jí)具有繼承性

線程是有繼承關(guān)系的,比如當(dāng)A線程中啟動(dòng)B線程,那么B和A的優(yōu)先級(jí)將是一樣的。

/**
* 線程優(yōu)先級(jí)
*/

public class TheadTest4 {
   public static void main(String[] args) {
       Thread thread = new Thread(new A());
       thread.start();
   }
}

class A implements Runnable {

   @Override
   public void run() {
       System.out.println('A的優(yōu)先級(jí)為:' + Thread.currentThread().getPriority());
       Thread thread = new Thread(new B());
       thread.start();
   }
}

class B implements Runnable {

   @Override
   public void run() {
       System.out.println('B的優(yōu)先級(jí)為:' + Thread.currentThread().getPriority());
   }
}

三、setPriority設(shè)置優(yōu)先級(jí)

          更改線程的優(yōu)先級(jí)。當(dāng)使用了setPriority設(shè)置了優(yōu)先級(jí),但是線程的優(yōu)先級(jí)仍然無(wú)法保障線程的執(zhí)行次序。只不過(guò),優(yōu)先級(jí)高的線程獲取CPU資源的概率較大,優(yōu)先級(jí)低的并非沒(méi)機(jī)會(huì)執(zhí)行。

/**
* 線程優(yōu)先級(jí)
*/

public class TheadTest4 {
  public static void main(String[] args) {
      Thread thread1 = new Thread(new A());
      Thread thread2 = new Thread(new B());
      //將優(yōu)先級(jí)設(shè)置到最低
      thread1.setPriority(10);
      //將優(yōu)先級(jí)設(shè)置到最高
      thread2.setPriority(1);
      //線程啟動(dòng)
      thread1.start();
      thread2.start();
  }
}

class A implements Runnable {
  @Override
  public void run() {
      for (int i = 0; i 10 ; i++) {
          System.out.println('A的優(yōu)先級(jí)為:' + Thread.currentThread().getPriority());
      }
  }
}

class B implements Runnable {
  @Override
  public void run() {
      for (int i = 0; i 10 ; i++) {
          System.out.println('B的優(yōu)先級(jí)為:' + Thread.currentThread().getPriority());
      }
  }
}


結(jié)果執(zhí)行了好幾次才出現(xiàn)的結(jié)果:

A的優(yōu)先級(jí)為:10
B的優(yōu)先級(jí)為:1
A的優(yōu)先級(jí)為:10
B的優(yōu)先級(jí)為:1
A的優(yōu)先級(jí)為:10
B的優(yōu)先級(jí)為:1
A的優(yōu)先級(jí)為:10
A的優(yōu)先級(jí)為:10
A的優(yōu)先級(jí)為:10
A的優(yōu)先級(jí)為:10
A的優(yōu)先級(jí)為:10
A的優(yōu)先級(jí)為:10
B的優(yōu)先級(jí)為:1
A的優(yōu)先級(jí)為:10
B的優(yōu)先級(jí)為:1
B的優(yōu)先級(jí)為:1
B的優(yōu)先級(jí)為:1
B的優(yōu)先級(jí)為:1
B的優(yōu)先級(jí)為:1
B的優(yōu)先級(jí)為:1

這就表示優(yōu)先級(jí)低的線程不是非得優(yōu)先級(jí)高的線程執(zhí)行完畢之后才執(zhí)行的,這也可以說(shuō)明線程就是隨機(jī)性的!

四、守護(hù)線程

守護(hù)線程是一種特殊的線程,它屬于是一種陪伴線程。簡(jiǎn)單點(diǎn)說(shuō) java 中有兩種線程:用戶線程和守護(hù)線程。可以通過(guò)isDaemon()方法來(lái)區(qū)別它們:如果返回false,則說(shuō)明該線程是“用戶線程”;否則就是“守護(hù)線程”。用戶線程一般用于執(zhí)行用戶級(jí)任務(wù),而守護(hù)線程也就是“后臺(tái)線程”,一般用來(lái)執(zhí)行后臺(tái)任務(wù)。需要注意的是:Java虛擬機(jī)在“用戶線程”都結(jié)束后會(huì)退出,所以守護(hù)線程也會(huì)隨之結(jié)束。注意:主線程main是用戶線程。

做一個(gè)小例子吧?。。?/p>

public class TheadTest4 {
   public static void main(String[] args) throws InterruptedException {
       Thread thread1 = new Thread(new A());
       //設(shè)置名稱為A
       thread1.setName('A...');
       //設(shè)置為守護(hù)線程
       thread1.setDaemon(true);
       thread1.start();

       Thread thread2 = new Thread(new A());
       //設(shè)置名稱為B
       thread2.setName('B...');
       thread2.start();
       Thread.sleep(3000);
       //直接中斷非守護(hù)線程
       thread2.interrupt();
       Thread.sleep(10000);
       System.out.println('程序結(jié)束!!!');
   }
}

class A implements Runnable {
   private int i;
   @Override
   public void run() {
       try {
           while (true) {
               i++;
               System.out.println('線程名稱:'+Thread.currentThread().getName()+',i=' + i + ',是否為守護(hù)線程:' + Thread.currentThread().isDaemon());
               Thread.sleep(1000);
           }
       } catch (InterruptedException e) {
           System.out.println('線程名稱:'+Thread.currentThread().getName()+'中斷線程了');
       }
   }
}

結(jié)果:

線程名稱:A...,i=1,是否為守護(hù)線程:true
線程名稱:B...,i=1,是否為守護(hù)線程:false
線程名稱:A...,i=2,是否為守護(hù)線程:true
線程名稱:B...,i=2,是否為守護(hù)線程:false
線程名稱:B...,i=3,是否為守護(hù)線程:false
線程名稱:A...,i=3,是否為守護(hù)線程:true
線程名稱:B...中斷線程了
線程名稱:A...,i=4,是否為守護(hù)線程:true
線程名稱:A...,i=5,是否為守護(hù)線程:true
線程名稱:A...,i=6,是否為守護(hù)線程:true
線程名稱:A...,i=7,是否為守護(hù)線程:true
線程名稱:A...,i=8,是否為守護(hù)線程:true
線程名稱:A...,i=9,是否為守護(hù)線程:true
線程名稱:A...,i=10,是否為守護(hù)線程:true
線程名稱:A...,i=11,是否為守護(hù)線程:true
線程名稱:A...,i=12,是否為守護(hù)線程:true
線程名稱:A...,i=13,是否為守護(hù)線程:true
程序結(jié)束!!!

從上面的代碼可以看出來(lái),B是用戶線程當(dāng)它中斷了之后守護(hù)線程還沒(méi)有結(jié)束,是因?yàn)橹骶€程(用戶線程)還沒(méi)有結(jié)束,所以說(shuō)明是所有的用戶線程結(jié)束之后守護(hù)線程才會(huì)結(jié)束。

五、習(xí)題

從以上的例子大家應(yīng)該還不知道守護(hù)線程到底有什么用處?。。∷袁F(xiàn)在為大家布置一個(gè)真實(shí)場(chǎng)景的習(xí)題。

求:創(chuàng)建一個(gè)用戶線程是向一個(gè)目錄里面存儲(chǔ)文件,再啟動(dòng)一個(gè)守護(hù)線程定時(shí)刪除這個(gè)目錄里面創(chuàng)建時(shí)間五秒前或者1分鐘前創(chuàng)建的文件。

該需求大家如果不會(huì)可以到初學(xué)者交流群里討論

    本站是提供個(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)論公約

    類似文章 更多