java多線程開發基礎
對于一個java程序猿來說,多線程開發技術無疑是需要掌握的。近期,小生在閱讀高洪巖先生編寫的《java多線程變成核心技術》一書。由于自己對于多線程開發了解的不多,而且在開發中使用的不多,希望通過閱讀此書,并提煉出書中重點知識以及總結自己的一些感悟來提升自己多于多線程技術的理解。還望各位大神多多指教哈!
1、進程與線程的概念與區別:
1.1 進程:進程是具有一定獨立功能的程序關于某個數據集合上的一次運行活動,進程是系統進行資源分配和調度的一個獨立單位。 簡單的理解,進程就是我們常說的應用程序。一般來說,一個應用也就是一個進程,但也可以有多進程的應用 。例如在Android開發中,常常會有一個后臺常駐的進程,這就屬于多進程。
1.2 線程:線程是進程的一個實體, 線程屬于進程,依附于進程存在 。線程是 CPU調度和分派的基本單位 。線程自己基本上不擁有系統資源,只擁有一點在運行中必不可少的資源(如程序計數器,一組寄存器和棧),但是它與同屬一個進程的其他的線程共享進程所擁有的全部資源。 一個進程至少擁有一個線程,可以有多個線程存在。
2、Java中多線程的使用方式:
2.1繼承Thread類:
public class MyThread extends Thread{
@Override
public void run() {
System.out.println ("MyThread自定義線程運行");
}
}
//調用
MyThread myThread = new MyThread();
myThread.start();
2.2 實現Runnable:
public class MyRunnable implements Runnable{
@Override
public void run() {
System.out.println("MyRunnable自定義線程運行");
}
}
//調用
MyRunnable myRunnable = new MyRunnable();
Thread thread = new Thread(myRunnable);
thread.start();
3、多線程類中常用的一些方法:
3.1 currentThread()方法:獲取執行當前代碼段的線程信息。
下面通過實例來說明:
public class MyThread extends Thread{
public MyThread() {
System.out.println("MyThread構造方法開始執行------");
System.out.println("Thread.currentThread().getName(): "+Thread.currentThread().getName());
System.out.println("this.getName(): "+this.getName());
System.out.println("MyThread構造方法執行結束------");
}
@Override
public void run() {
System.out.println("run方法開始執行------");
System.out.println("run方法打印: "+Thread.currentThread().getName());
System.out.println("this.getName(): "+this.getName());
System.out.println("MyThread構造方法執行結------");
}
}
//調用
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();
}
//打印結果
MyThread構造方法開始執行------
Thread.currentThread().getName(): main
this.getName(): Thread-0
MyThread構造方法執行結束------
------------------------------------
run方法開始執行------
run方法打印: A
this.getName(): mythread
MyThread構造方法執行結------
分析:構造方法在main方法,也就是在main線程中調用。因此, Thread.currentThread() 獲取的是調用構造方法所在的線程,也就是main線程。而 this 指的是該類當前對象,也就是在main方法中通過new關鍵字創建的對象。
3.2 isAlive()方法:判斷當前線程是否處于活動狀態(線程已經啟動但是尚未終止)。
3.3 sleep()方法:Thread類中的靜態方法。讓當前“正在執行的線程”休眠(暫停執行),該線程指的是this.currentThread()返回的線程。
3.4 wait()方法:Object類中的方法。該方法使得當前線程進入"預執行隊列",線程在wait()處等待,直到該線程接收到notify通知才會繼續執行。或者是被中斷才會停止。(該方法在后續講解線程通信時會詳細說明,此處只是為了與sleep對比)
wait方法調用前該線程必須獲取對象鎖,調用之后會釋放該對象的鎖
sleep方法調用之后不會釋放該對象的鎖
3.5 線程暫停和停止的相關方法:
Thread類中提供了比較多的方法來暫停或者停止線程,例如:stop、suspend,以及判斷線程是否停止的方法,interrupted、isInterrupted等。不過jdk中已經不推薦使用stop相關方法停止線程。比較好的方式是: 在run方法中通過具體業務邏輯來結束線程的運行。
結束語
小生第一次在簡書上寫文章,內容相對來說會比較簡單,后續我會堅持寫下去。希望能夠幫助到那些想要了解java多線程開發的童鞋。請大家多多支持哈。在此跪謝了哈。 I will always work hard
來自:http://www.jianshu.com/p/ca309a082a5c