欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

Java線程的控制詳解

 更新時間:2014年10月31日 10:19:46   投稿:hebedich  
這篇文章主要介紹了Java中的join線程、后臺線程、線程睡眠、線程讓步以及線程的優(yōu)先級,非常的詳細,希望能對大家有所幫助

1. join線程

在線程執(zhí)行過程中,有時想讓另一個線程先執(zhí)行,比如將一大問題分割成許多小問題,給每一個小問題分配線程,但所有小問題處理完后再讓主線程進一步操作。此時我們可以在主線程中調用其它線程的join()方法,以阻塞調用線程(在這里為主線程)。

示例代碼:

復制代碼 代碼如下:

 package org.frzh.thread;
 
 public class JoinThread extends Thread{
     //提供一個有參構造器,用來設置線程的名字
     public JoinThread(String name) {
         super(name);
     }
    
     public void run() {
         for (int i = 0; i < 100; i++) {
             System.out.println(getName() + " " + i);
         }
     }
    
     public static void main(String[] args) {
         //啟動子線程
         new JoinThread("新線程").start();
         for (int i = 0; i < 100; i++) {
             if (i == 20) {
                 JoinThread jt = new JoinThread("被join的線程");
                 jt.start();
                 //main線程調用了jt線程的join方法,則main線程必須等待jt執(zhí)行完之后才能執(zhí)行
                 try {
                     jt.join();
                 } catch (InterruptedException e) {
                     // TODO Auto-generated catch block
                     e.printStackTrace();
                 }
             }
             System.out.println(Thread.currentThread().getName() + " " +i);
         }
     }
 }

本來有三套線程(兩條子線程和一main線程),當i=20后,main線程被阻塞必須等到“被join線程”執(zhí)行完之后才有機會執(zhí)行,所以此后只有兩條線程執(zhí)行。

join()方法的三種重載形式:

join():等待被join線程執(zhí)行完;

join(long millis):等待被join線程執(zhí)行最長為mills豪秒,在這之后即使被join線程沒有執(zhí)行完也不再等待;

join(long millis, int nanos):等待被join線程執(zhí)行最長時間為millis毫秒+nanos微秒。(此方法基本用不上)。

2:后臺線程

有一種線程,他是在后臺運行,他的任務是為其他線程服務,這種線程被稱為“后臺線程”、“守護線程”或“精靈線程”。當所有前臺線程都死亡后,后臺線程會自動死亡。

示例代碼:

復制代碼 代碼如下:

 package org.frzh.thread;
 
 public class DaemonThread extends Thread{
     public void run() {
         for (int i = 0; i < 1000; i++) {
             System.out.println(getName() + " " +i);
         }
     }
    
     public static void main(String[] args) {
         DaemonThread dt = new DaemonThread();
         //將此線程設置為后臺線程
         dt.setDaemon(true);
         dt.start();
         for (int i = 0; i < 10; i++) {
             System.out.println(Thread.currentThread().getName() + " " + i);
         }
         //前臺線程結束,那么后臺線程dt也會結束,所以它執(zhí)行不到999
     }
 }

主線程默認是前臺線程,前臺線程創(chuàng)建的子線程默認是前臺線程,后臺線程創(chuàng)建的子線程默認是后臺線程。

3.線程睡眠(sleep):

前面的join方法是讓調用線程等待被join線程執(zhí)行完之后再繼續(xù)執(zhí)行,而sleep()方法是讓調用線程阻塞一段時間后再重新進入就緒狀態(tài)等待被調度。因此它通常用來暫停程序的執(zhí)行。

示例代碼:

復制代碼 代碼如下:

 package org.frzh.thread;
 
 import java.util.Date;
 
 public class SleepThread{
     public static void main(String[] args) {
         for (int i = 0; i < 10; i++) {
             System.out.println("當前時間:" + new Date());
             try {
                 Thread.sleep(1000);
             } catch (InterruptedException e) {
                 // TODO Auto-generated catch block
                 e.printStackTrace();
             }
         }
     }
 }

sleep()方法的兩種重載方式:

static void sleep(long millis):讓當前線程暫停millis毫秒,并進入阻塞狀態(tài)。該方法會受到系統(tǒng)計時器和線程調度器的精度和準度的影響。

static void sleep(long millis, int nanos):暫停mills毫秒+nanos微秒,并進入阻塞狀態(tài),同樣會受系統(tǒng)計時器和線程調度器的精度和準度的影響?;静挥谩?/p>

4.線程讓步(yield):

yield()方法和sleep方法有點類似,它同樣可以使當前正在運行的線程暫停,但他不會阻塞該線程,只是將他轉入就緒狀態(tài)(注意不是阻塞狀態(tài))。yield()方法只會讓和它同等優(yōu)先級或更高優(yōu)先級的線程有被執(zhí)行的機會,所以某一線程調用該方法后可能又被重新調度回來繼續(xù)執(zhí)行。

示例代碼:

復制代碼 代碼如下:

 package org.frzh.thread;
 
 public class YieldThread extends Thread{
     public YieldThread() {
        
     }
     public YieldThread(String name) {
         super(name);
     }
     public void run() {
         for (int i = 0; i < 100; i++) {
             System.out.println(getName() + " " +i);
             if (i == 20) {
                 //當前線程讓步
                 Thread.yield();
             }
         }
        
     }
    
     public static void main(String[] args) {
         //啟動兩條并發(fā)線程
         YieldThread yt1 = new YieldThread("高級");
         //設置yt1為最高優(yōu)先級
         yt1.setPriority(Thread.MAX_PRIORITY);
         yt1.start();
         YieldThread yt2 = new YieldThread("低級");
         yt2.setPriority(Thread.MIN_PRIORITY);
         yt2.start();
         /*
          * 如果不給線程設置優(yōu)先級,則兩個線程的優(yōu)先級是相同的,所以兩線程會交替執(zhí)行,當調用yield后會讓另一個線程執(zhí)行;
          * 但是,給兩個線程分別設置上述優(yōu)先級之后,剛開始高級線程執(zhí)行,當i=20時,調用yield,但由于yield方法只會
          * 給和它同優(yōu)先級或更高優(yōu)先級的線程執(zhí)行機會,所以此時仍是高級線程執(zhí)行,而不會讓給低級線程
          */
     }
 }

5:改變線程的優(yōu)先級

此舉比較簡單,只需調用調用實例方法setPriority(int priority)方法即可。每個線程默認與其父線程的優(yōu)先級相同,main線程默認具有普通優(yōu)先級(5)。java提供1~10個優(yōu)先級,也可以使用三個靜態(tài)常量:

MAX_PRIORITY:10

MIN_PRIORITY:1

NORM_PRIORITY:5

注意的是:盡管java提供10個優(yōu)先級,但是不同的系統(tǒng)支持的優(yōu)先級不一樣,所以盡量避免直接使用1~10之間的數字,而使用靜態(tài)常量,以保證具有良好的可移植性。

相關文章

  • 詳解使用spring aop實現業(yè)務層mysql 讀寫分離

    詳解使用spring aop實現業(yè)務層mysql 讀寫分離

    本篇文章主要介紹了使用spring aop實現業(yè)務層mysql 讀寫分離,小編覺得挺不錯的,現在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2017-01-01
  • 一文帶你快速學會JDBC及獲取連接的五種方式

    一文帶你快速學會JDBC及獲取連接的五種方式

    JDBC(Java Database Connectivity)是一個獨立于特定數據庫管理系統(tǒng)、通用的SQL數據庫存取和操作的公共接口,下面這篇文章主要給大家介紹了關于如何通過一文帶你快速學會JDBC及獲取連接的五種方式,需要的朋友可以參考下
    2022-09-09
  • java唯一字符串ID生成方案詳解

    java唯一字符串ID生成方案詳解

    這篇文章主要給大家介紹了關于java唯一字符串ID生成方案的相關資料,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2020-10-10
  • java打包解包操作小結

    java打包解包操作小結

    使用別人的jar包程序,需要修改其中的相關參數然后重新打包,在此記錄一下打包和解包過程,感興趣的朋友跟隨小編一起看看吧
    2023-10-10
  • java實現文件下載的兩種方式

    java實現文件下載的兩種方式

    這篇文章主要為大家詳細介紹了java實現文件下載的兩種方式,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2017-11-11
  • Java版仿QQ驗證碼風格圖片驗證碼

    Java版仿QQ驗證碼風格圖片驗證碼

    這篇文章主要為大家分享了java圖片驗證碼實例代碼,感興趣的小伙伴們可以參考一下
    2016-04-04
  • SpringBoot 中大文件(分片上傳)斷點續(xù)傳與極速秒傳功能的實現

    SpringBoot 中大文件(分片上傳)斷點續(xù)傳與極速秒傳功能的實現

    這篇文章主要介紹了SpringBoot 中大文件(分片上傳)斷點續(xù)傳與極速秒傳功能的實現,本文通過實例代碼給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2020-07-07
  • 使用BindingResult 自定義錯誤信息

    使用BindingResult 自定義錯誤信息

    這篇文章主要介紹了使用BindingResult 自定義錯誤信息,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2021-10-10
  • java 運行報錯has been compiled by a more recent version of the Java Runtime

    java 運行報錯has been compiled by a more recent version of the J

    java 運行報錯has been compiled by a more recent version of the Java Runtime (class file version 54.0)
    2021-04-04
  • Java阻塞隊列的實現及應用

    Java阻塞隊列的實現及應用

    這篇文章主要介紹了剖析Java中阻塞隊列的實現原理及應用場景,這里也對阻塞和非阻塞隊列的不同之處進行了對比,需要的朋友可以參考下
    2021-10-10

最新評論