最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Java 多線程實例詳解(二)

 更新時間:2016年09月05日 16:16:32   作者:Corn  
本文主要介紹Java 多線程的資料整理,這里整理了詳細資料及相關(guān)示例代碼,有興趣的小伙伴可以參考下

本文承接上一篇文章《Java多線程實例詳解(一)》。

四.Java多線程的阻塞狀態(tài)與線程控制

上文已經(jīng)提到Java阻塞的幾種具體類型。下面分別看下引起Java線程阻塞的主要方法。

1.join()

join —— 讓一個線程等待另一個線程完成才繼續(xù)執(zhí)行。如A線程線程執(zhí)行體中調(diào)用B線程的join()方法,則A線程被阻塞,知道B線程執(zhí)行完為止,A才能得以繼續(xù)執(zhí)行。

public class ThreadTest {

 public static void main(String[] args) {

 MyRunnable myRunnable = new MyRunnable();
 Thread thread = new Thread(myRunnable);

 for (int i = 0; i < 100; i++) {
  System.out.println(Thread.currentThread().getName() + " " + i);
  if (i == 30) {
  thread.start();
  try {
   thread.join(); // main線程需要等待thread線程執(zhí)行完后才能繼續(xù)執(zhí)行
  } catch (InterruptedException e) {
   e.printStackTrace();
  }
  }
 }
 }
}

class MyRunnable implements Runnable {

 @Override
 public void run() {
 for (int i = 0; i < 100; i++) {
  System.out.println(Thread.currentThread().getName() + " " + i);
 }
 }
}

2.sleep()

sleep —— 讓當(dāng)前的正在執(zhí)行的線程暫停指定的時間,并進入阻塞狀態(tài)。在其睡眠的時間段內(nèi),該線程由于不是處于就緒狀態(tài),因此不會得到執(zhí)行的機會。即使此時系統(tǒng)中沒有任何其他可執(zhí)行的線程,出于sleep()中的線程也不會執(zhí)行。因此sleep()方法常用來暫停線程執(zhí)行。

前面有講到,當(dāng)調(diào)用了新建的線程的start()方法后,線程進入到就緒狀態(tài),可能會在接下來的某個時間獲取CPU時間片得以執(zhí)行,如果希望這個新線程必然性的立即執(zhí)行,直接調(diào)用原來線程的sleep(1)即可。

public class ThreadTest {

 public static void main(String[] args) {

 MyRunnable myRunnable = new MyRunnable();
 Thread thread = new Thread(myRunnable);

 for (int i = 0; i < 100; i++) {
  System.out.println(Thread.currentThread().getName() + " " + i);
  if (i == 30) {
  thread.start();
  try {
   Thread.sleep(1); // 使得thread必然能夠馬上得以執(zhí)行
  } catch (InterruptedException e) {
   e.printStackTrace();
  }
  }
 }
 }
}

class MyRunnable implements Runnable {

 @Override
 public void run() {
 for (int i = 0; i < 100; i++) {
  System.out.println(Thread.currentThread().getName() + " " + i);
 }
 }
}

注:睡一個毫秒級夠了,因為CPU不會空閑,會切換到新建的線程。

3.后臺線程(Daemon Thread)

概念/目的:后臺線程主要是為其他線程(相對可以稱之為前臺線程)提供服務(wù),或“守護線程”。如JVM中的垃圾回收線程。

生命周期:后臺線程的生命周期與前臺線程生命周期有一定關(guān)聯(lián)。主要體現(xiàn)在:當(dāng)所有的前臺線程都進入死亡狀態(tài)時,后臺線程會自動死亡(其實這個也很好理解,因為后臺線程存在的目的在于為前臺線程服務(wù)的,既然所有的前臺線程都死亡了,那它自己還留著有什么用...偉大啊 ! !)。

設(shè)置后臺線程:調(diào)用Thread對象的setDaemon(true)方法可以將指定的線程設(shè)置為后臺線程。

public class ThreadTest {

 public static void main(String[] args) {
 Thread myThread = new MyThread();
 for (int i = 0; i < 100; i++) {
  System.out.println("main thread i = " + i);
  if (i == 20) {
  myThread.setDaemon(true);
  myThread.start();
  }
 }
 }

}

class MyThread extends Thread {

 public void run() {
 for (int i = 0; i < 100; i++) {
  System.out.println("i = " + i);
  try {
  Thread.sleep(1);
  } catch (InterruptedException e) {
  // TODO Auto-generated catch block
  e.printStackTrace();
  }
 }
 }
}

判斷線程是否是后臺線程:調(diào)用thread對象的isDeamon()方法。

注:main線程默認(rèn)是前臺線程,前臺線程創(chuàng)建中創(chuàng)建的子線程默認(rèn)是前臺線程,后臺線程中創(chuàng)建的線程默認(rèn)是后臺線程。調(diào)用setDeamon(true)方法將前臺線程設(shè)置為后臺線程時,需要在start()方法調(diào)用之前。前天線程都死亡后,JVM通知后臺線程死亡,但從接收指令到作出響應(yīng),需要一定的時間。

4.改變線程的優(yōu)先級/setPriority():

每個線程在執(zhí)行時都具有一定的優(yōu)先級,優(yōu)先級高的線程具有較多的執(zhí)行機會。每個線程默認(rèn)的優(yōu)先級都與創(chuàng)建它的線程的優(yōu)先級相同。main線程默認(rèn)具有普通優(yōu)先級。

設(shè)置線程優(yōu)先級:setPriority(int priorityLevel)。參數(shù)priorityLevel范圍在1-10之間,常用的有如下三個靜態(tài)常量值:

MAX_PRIORITY:10

MIN_PRIORITY:1

NORM_PRIORITY:5

獲取線程優(yōu)先級:getPriority()。

注:具有較高線程優(yōu)先級的線程對象僅表示此線程具有較多的執(zhí)行機會,而非優(yōu)先執(zhí)行。

public class ThreadTest {

 public static void main(String[] args) {
 Thread myThread = new MyThread();
 for (int i = 0; i < 100; i++) {
  System.out.println("main thread i = " + i);
  if (i == 20) {
  myThread.setPriority(Thread.MAX_PRIORITY);
  myThread.start();
  }
 }
 }

}

class MyThread extends Thread {

 public void run() {
 for (int i = 0; i < 100; i++) {
  System.out.println("i = " + i);
 }
 }
}

5.線程讓步:yield()

上一篇博文中已經(jīng)講到了yield()的基本作用,同時,yield()方法還與線程優(yōu)先級有關(guān),當(dāng)某個線程調(diào)用yiled()方法從運行狀態(tài)轉(zhuǎn)換到就緒狀態(tài)后,CPU從就緒狀態(tài)線程隊列中只會選擇與該線程優(yōu)先級相同或優(yōu)先級更高的線程去執(zhí)行。

public class ThreadTest {

 public static void main(String[] args) {
 Thread myThread1 = new MyThread1();
 Thread myThread2 = new MyThread2();
 myThread1.setPriority(Thread.MAX_PRIORITY);
 myThread2.setPriority(Thread.MIN_PRIORITY);
 for (int i = 0; i < 100; i++) {
  System.out.println("main thread i = " + i);
  if (i == 20) {
  myThread1.start();
  myThread2.start();
  Thread.yield();
  }
 }
 }

}

class MyThread1 extends Thread {

 public void run() {
 for (int i = 0; i < 100; i++) {
  System.out.println("myThread 1 -- i = " + i);
 }
 }
}

class MyThread2 extends Thread {

 public void run() {
 for (int i = 0; i < 100; i++) {
  System.out.println("myThread 2 -- i = " + i);
 }
 }
}

 系列文章:

java 多線程實例講解 (一)
Java 多線程實例詳解(二)
Java 多線程實例詳解(三)

相關(guān)文章

  • 一文帶你搞懂Java類加載機制

    一文帶你搞懂Java類加載機制

    Java?類加載機制是?Java?運行時的核心組成部分,負責(zé)在程序運行過程中動態(tài)加載和連接類文件,并將其轉(zhuǎn)換為可執(zhí)行代碼,接下來小編就來帶大家搞懂面試官老問的?Java?類加載機制,需要的朋友可以參考下
    2023-08-08
  • 詳解Java向服務(wù)端發(fā)送文件的方法

    詳解Java向服務(wù)端發(fā)送文件的方法

    這篇文章主要為大家詳細介紹了Java向服務(wù)端發(fā)送文件的方法,主要是IO流,感興趣的小伙伴們可以參考一下
    2016-05-05
  • 淺析Java中StringBuffer和StringBuilder的使用

    淺析Java中StringBuffer和StringBuilder的使用

    當(dāng)對字符串進行修改的時候,需要使用 StringBuffer 和 StringBuilder 類。本文就來和大家簡單聊聊這二者的使用與區(qū)別吧,希望對大家有所幫助
    2023-04-04
  • 基于jenkins構(gòu)建結(jié)果企業(yè)微信提醒

    基于jenkins構(gòu)建結(jié)果企業(yè)微信提醒

    這篇文章主要介紹了基于jenkins構(gòu)建結(jié)果企業(yè)微信提醒,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下
    2020-08-08
  • 詳解如何獲取java中類的所有對象實例

    詳解如何獲取java中類的所有對象實例

    如何在運行時獲取一個Java類的所有對象實例呢,本文給大家介紹一種底層實現(xiàn)的方式,基于jvmti,代碼用C++實現(xiàn),感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下
    2023-10-10
  • Gradle的SpringBoot項目構(gòu)建圖解

    Gradle的SpringBoot項目構(gòu)建圖解

    這篇文章主要介紹了Gradle的SpringBoot項目構(gòu)建圖解,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2024-01-01
  • java貪心算法初學(xué)感悟圖解及示例分享

    java貪心算法初學(xué)感悟圖解及示例分享

    這篇文章主要為大家介紹了本人在初學(xué)java貪心算法的感悟,并通過圖解及示例代碼的方式分享給大家,有需要的朋友可以借鑒參考下,希望能夠有所幫助
    2021-11-11
  • Java中wait()與sleep()兩者的不同深入解析

    Java中wait()與sleep()兩者的不同深入解析

    在Java多線程編程中,wait()和sleep()是控制線程執(zhí)行和等待的兩個關(guān)鍵方法,但它們在應(yīng)用場景和實現(xiàn)上有顯著差異,這篇文章主要介紹了Java中wait()與sleep()兩者的不同,需要的朋友可以參考下
    2024-11-11
  • Java利用蒙特卡洛方法求解圓周率π值

    Java利用蒙特卡洛方法求解圓周率π值

    蒙特·卡羅方法(Monte Carlo method),也稱統(tǒng)計模擬方法,是一種以概率統(tǒng)計理論為基礎(chǔ)的數(shù)值計算方法。本文將利用該方法實現(xiàn)圓周率的計算,需要的可以參考一下
    2022-08-08
  • Java中5種輸出換行方式小結(jié)

    Java中5種輸出換行方式小結(jié)

    在Java中,輸出換行符是一項非?;镜牟僮?它在控制臺中輸出文本時非常常見,本文主要介紹了Java中5種輸出換行方式小結(jié),具有一定的參考價值,感興趣的可以了解一下
    2024-02-02

最新評論

武平县| 汉沽区| 辉县市| 库车县| 罗江县| 腾冲县| 松桃| 鹤壁市| 隆回县| 金乡县| 垣曲县| 赞皇县| 改则县| 芮城县| 萨迦县| 时尚| 化德县| 曲麻莱县| 岱山县| 锡林浩特市| 禹城市| 成都市| 兴安盟| 习水县| 松溪县| 榆中县| 龙井市| 沙湾县| 黑山县| 德惠市| 海口市| 苍南县| 衡山县| 酒泉市| 清镇市| 裕民县| 屏边| 佳木斯市| 新蔡县| 新丰县| 二手房|