再愛不回頭。可如果是你,那就讓我回頭下吧。
最近在項目中使用了多線程,初次體驗效果還是很不錯的,所以有有必要學習下和記錄下,雖然以前是學過一段時間,但是主要是對付面試,就沒有很深入的進入學習,所以這次是深入進去學習下多線程的。這篇文章主要就是記錄下線程的基本信息。個人認爲,多線程是我們必須學的,同時也是必須要學好的部分。
線程的狀態說明 :
1 : 新建狀態(New) : 線程對象被創建後,就進入了新建狀態。
比如 : Thread trhead = new Thread(); 代碼就是這樣理解
2 : 就緒狀態 (Runnable): 就緒狀態也可以稱爲: 可執行狀態。線程對象創建後,其他線程調用了該對象的start()方法,來啓動線程.
比如 : thread.start(); 就是主線程來調用thread對象的start方法,就是處理就緒狀態,隨時都可能被CPU調度執行.
3 : 運行狀態 (Running): 線程獲取CPU權限進行執行。需要注意的是,線程只能從就緒狀態進入到運行狀態。
4 : 阻塞狀態 (Blocked): 阻塞狀態是線程因爲某種原因放棄CPU使用權,暫停使用權,直到線程進入到就緒狀態,纔有機會轉到運行狀態.阻塞的狀態有如下的幾種 :
4.1 : 等待阻塞 : -- 通過調用線程的wait()方法,讓線程等待某工作的完成.
4.2 : 同步阻塞 : 線程在獲取synchronized同步鎖失敗(因爲鎖被其它線程所佔用),它會進入同步阻塞狀態。(synchronized會在後續說到,同一個對象,synchronized修改的多個方法,只有一個方法在同一時刻是可以調用的,其他的線程都會被阻塞起來,如果沒synchronized修飾的方法就不會進行阻塞.)
4.3 : 其他阻塞 : 通過調用線程的sleep()或join()或發出了I/O請求時,線程會進入到阻塞狀態。當sleep()狀態超時、join()等待線程終止或者超時、或者I/O處理完畢時,線程重新轉入就緒狀態。
5 : 死亡狀態(Dead) : 線程執行完了或者因異常退出了run()方法,該線程結束了生命週期。
如下是線程狀態的圖片說明
2 : 實現線程的方法有
2.1 : 直接繼承Thread : 代碼如下
package com.yang.create;
/***********************************************************************
*<PRE>
*
* File Name : 創建線程的方式一 ; 繼承Thread 實現run方法
*
* Creation Date : 19-9-12
*
* Author : Gavin
*
* Purpose :
*
* History :
*
*</PRE>
***************************************************************************/
public class CreateThreadFunctionOne extends Thread {
public CreateThreadFunctionOne(String name){ super(name); }
@Override
public void run() {
for(int i=0;i<20;i++){
System.out.println(this.getName() + " : " + i);
}
}
public static void main(String[] args) {
for(int i=0;i<5;i++){
new CreateThreadFunctionOne("Thread Number : " + i).start();
}
}
}
2.2 實現 Runnable 接口 : 代碼如下
package com.yang.create;
/***********************************************************************
*<PRE>
*
* File Name : 創建線程方法二
*
*
* Creation Date : 19-9-12
*
* Author : Gavin
*
* Purpose : 實現 Runnable接口,重寫run方法
*
* History :
*
*</PRE>
***************************************************************************/
public class CreateThreadFunctionTwo implements Runnable {
@Override
public void run() {
for(int i=0;i<20;i++){
System.out.println(Thread.currentThread().getName() + " Number : " + i);
}
}
public static void main(String[] args) {
for(int i=0;i<5;i++){
CreateThreadFunctionTwo createThreadFunctionTwo = new CreateThreadFunctionTwo();
new Thread(createThreadFunctionTwo,"thread : " + i).start();
}
}
}
Thread 和 Runnable 的相同點:
都是實現多線程的方式
Thread 和 Runnable 不同點是 :
Thread 是類,Runnable 是接口,Thread類本身是實現了Runnable 類的接口。
我們知道“一個類只能有一個父類,但是卻能實現多個接口”,因此Runnable具有更好的擴展性。
此外,Runnable還可以用於“資源的共享”。即,多個線程都是基於某一個Runnable對象建立的,它們會共享Runnable對象上的資源。
通常,建議通過“Runnable”實現多線程!