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

Java 多線程實例詳解(二)

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

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

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

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

1.join()

join —— 讓一個線程等待另一個線程完成才繼續(xù)執(zhí)行。如A線程線程執(zhí)行體中調用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 —— 讓當前的正在執(zhí)行的線程暫停指定的時間,并進入阻塞狀態(tài)。在其睡眠的時間段內,該線程由于不是處于就緒狀態(tài),因此不會得到執(zhí)行的機會。即使此時系統(tǒng)中沒有任何其他可執(zhí)行的線程,出于sleep()中的線程也不會執(zhí)行。因此sleep()方法常用來暫停線程執(zhí)行。

前面有講到,當調用了新建的線程的start()方法后,線程進入到就緒狀態(tài),可能會在接下來的某個時間獲取CPU時間片得以執(zhí)行,如果希望這個新線程必然性的立即執(zhí)行,直接調用原來線程的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)

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

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

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

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();
  }
 }
 }
}

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

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

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

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

設置線程優(yōu)先級:setPriority(int priorityLevel)。參數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()

上一篇博文中已經講到了yield()的基本作用,同時,yield()方法還與線程優(yōu)先級有關,當某個線程調用yiled()方法從運行狀態(tài)轉換到就緒狀態(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 多線程實例詳解(三)

相關文章

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

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

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

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

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

    淺析Java中StringBuffer和StringBuilder的使用

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

    基于jenkins構建結果企業(yè)微信提醒

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

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

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

    Gradle的SpringBoot項目構建圖解

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

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

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

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

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

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

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

    Java中5種輸出換行方式小結

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

最新評論

丰镇市| 宝坻区| 略阳县| 芜湖市| 古丈县| 永善县| 云梦县| 皮山县| 韶山市| 定兴县| 东兴市| 潼关县| 石阡县| 灵武市| 晋州市| 云龙县| 读书| 武义县| 东阳市| 桑日县| 封开县| 孟州市| 永安市| 博野县| 上林县| 铜陵市| 舟曲县| 河源市| 左贡县| 奉贤区| 廉江市| 兴城市| 大荔县| 石柱| 松溪县| 沙湾县| 铅山县| 家居| 罗田县| 揭阳市| 五指山市|