java多線程開發(fā)基礎(chǔ)

對于一個(gè)java程序猿來說,多線程開發(fā)技術(shù)無疑是需要掌握的。近期,小生在閱讀高洪巖先生編寫的《java多線程變成核心技術(shù)》一書。由于自己對于多線程開發(fā)了解的不多,而且在開發(fā)中使用的不多,希望通過閱讀此書,并提煉出書中重點(diǎn)知識以及總結(jié)自己的一些感悟來提升自己多于多線程技術(shù)的理解。還望各位大神多多指教哈!

1、進(jìn)程與線程的概念與區(qū)別:

1.1 進(jìn)程:進(jìn)程是具有一定獨(dú)立功能的程序關(guān)于某個(gè)數(shù)據(jù)集合上的一次運(yùn)行活動,進(jìn)程是系統(tǒng)進(jìn)行資源分配和調(diào)度的一個(gè)獨(dú)立單位。簡單的理解,進(jìn)程就是我們常說的應(yīng)用程序。一般來說,一個(gè)應(yīng)用也就是一個(gè)進(jìn)程,但也可以有多進(jìn)程的應(yīng)用。例如在Android開發(fā)中,常常會有一個(gè)后臺常駐的進(jìn)程,這就屬于多進(jìn)程。
1.2 線程:線程是進(jìn)程的一個(gè)實(shí)體,線程屬于進(jìn)程,依附于進(jìn)程存在。線程是CPU調(diào)度和分派的基本單位。線程自己基本上不擁有系統(tǒng)資源,只擁有一點(diǎn)在運(yùn)行中必不可少的資源(如程序計(jì)數(shù)器,一組寄存器和棧),但是它與同屬一個(gè)進(jìn)程的其他的線程共享進(jìn)程所擁有的全部資源。一個(gè)進(jìn)程至少擁有一個(gè)線程,可以有多個(gè)線程存在。

2、Java中多線程的使用方式:

2.1繼承Thread類:

public class MyThread extends Thread{
     @Override
      public void run() {
         System.out.println ("MyThread自定義線程運(yùn)行");
      }
}
//調(diào)用
MyThread myThread = new MyThread();
myThread.start();

2.2 實(shí)現(xiàn)Runnable:

public class MyRunnable implements Runnable{    
     @Override   
     public void run() {        
            System.out.println("MyRunnable自定義線程運(yùn)行");    
      }
}
//調(diào)用
MyRunnable myRunnable = new MyRunnable();
Thread thread = new Thread(myRunnable);
thread.start();

3、多線程類中常用的一些方法:

3.1 currentThread()方法:獲取執(zhí)行當(dāng)前代碼段的線程信息。
下面通過實(shí)例來說明:

public class MyThread extends Thread{
     
    public MyThread() {    
         System.out.println("MyThread構(gòu)造方法開始執(zhí)行------");
         System.out.println("Thread.currentThread().getName():   "+Thread.currentThread().getName());
         System.out.println("this.getName():   "+this.getName());
         System.out.println("MyThread構(gòu)造方法執(zhí)行結(jié)束------");
    }
   @Override
    public void run() {    
          System.out.println("run方法開始執(zhí)行------");
          System.out.println("run方法打?。?  "+Thread.currentThread().getName());
          System.out.println("this.getName():   "+this.getName());
          System.out.println("MyThread構(gòu)造方法執(zhí)行結(jié)------");
   }
}
    //調(diào)用
    public static void main(String[] args) {    
         MyThread myThread = new MyThread();
         myThread.setName("mythread");
         Thread thread = new Thread(myThread);
         thread.setName("A");
         System.out.println("------------------------------------");
         thread.start();
  }
//打印結(jié)果
MyThread構(gòu)造方法開始執(zhí)行------
Thread.currentThread().getName():   main
this.getName():   Thread-0
MyThread構(gòu)造方法執(zhí)行結(jié)束------
------------------------------------
run方法開始執(zhí)行------
run方法打印:   A
this.getName():   mythread
MyThread構(gòu)造方法執(zhí)行結(jié)------

分析:構(gòu)造方法在main方法,也就是在main線程中調(diào)用。因此,Thread.currentThread()獲取的是調(diào)用構(gòu)造方法所在的線程,也就是main線程。而this指的是該類當(dāng)前對象,也就是在main方法中通過new關(guān)鍵字創(chuàng)建的對象。

3.2 isAlive()方法:判斷當(dāng)前線程是否處于活動狀態(tài)(線程已經(jīng)啟動但是尚未終止)。

3.3 sleep()方法:Thread類中的靜態(tài)方法。讓當(dāng)前“正在執(zhí)行的線程”休眠(暫停執(zhí)行),該線程指的是this.currentThread()返回的線程。

3.4 wait()方法:Object類中的方法。該方法使得當(dāng)前線程進(jìn)入"預(yù)執(zhí)行隊(duì)列",線程在wait()處等待,直到該線程接收到notify通知才會繼續(xù)執(zhí)行?;蛘呤潜恢袛嗖艜V?。(該方法在后續(xù)講解線程通信時(shí)會詳細(xì)說明,此處只是為了與sleep對比)
wait方法調(diào)用前該線程必須獲取對象鎖,調(diào)用之后會釋放該對象的鎖
sleep方法調(diào)用之后不會釋放該對象的鎖

3.5 線程暫停和停止的相關(guān)方法:
Thread類中提供了比較多的方法來暫?;蛘咄V咕€程,例如:stop、suspend,以及判斷線程是否停止的方法,interrupted、isInterrupted等。不過jdk中已經(jīng)不推薦使用stop相關(guān)方法停止線程。比較好的方式是:在run方法中通過具體業(yè)務(wù)邏輯來結(jié)束線程的運(yùn)行。

結(jié)束語

小生第一次在簡書上寫文章,內(nèi)容相對來說會比較簡單,后續(xù)我會堅(jiān)持寫下去。希望能夠幫助到那些想要了解java多線程開發(fā)的童鞋。請大家多多支持哈。在此跪謝了哈。I will always work hard

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容