20 Java基礎筆記-執行緒
阿新 • • 發佈:2018-11-19
執行緒
一,程式,程序,執行緒
1,程式:指令集,靜態概念
2,程序:作業系統,排程程式,動態概念
3,執行緒:在程序內的多條執行路徑,多執行緒併發執行可以提高程式效率。
二,多執行緒並行與併發
並行:兩個任務同時執行(需要多核CPU)。
併發:兩個任務都請求執行,處理器安排輪流執行。
三,JVM執行原理與多執行緒
1,Java命令會啟動java虛擬機器,啟動JVM,等於啟動一個程序,該程序會自動啟動“主執行緒”,緊接著主執行緒去呼叫某類的main方法。
2,JVM啟動至少會啟動垃圾回收執行緒和主執行緒,所以JVM是多執行緒。
四,多執行緒實現
1>繼承Thread
1,->定義類繼承Thread
2, -->重寫run方法
3, --->把任務寫在run方法中
4,---->建立執行緒物件,呼叫start()開啟執行緒
5, ----->開啟新執行緒,內部執run方法
public class ThreadDemo{
public static void main(String[] args){
MyThread th = new MyThread();
th.start();
}
class MyThread extenda Thread{
public void run (){
System.out.println("我要執行多執行緒!");
}
}
}
2>實現runnable
1,->定義類實現Runnable介面
2,-->實現run方法
3,--->把任務寫在run方法中
4,---->建立自定義的Runnable的子類物件
5,----->建立Thread物件,傳入Runnable
6,------>呼叫start()開啟新執行緒,內部呼叫Runnable方法
eg:
public class RunnableDemo{
public static void main(Strig[ ] main){
MyRunnable mr = new MyRunnable();
Thread th = new Thread(mr);
th.start();
}
class MyRunnable implements Runnable{
System.out.println("我要執行多執行緒!");
}
}
五,獲取與設定名字
1,獲取名字:通過getName()方法獲取執行緒物件的名字.
2,設定名字:通過setName()方法、建構函式傳入String型別的名字.
六,主要方法
1,currentThread():獲取當前執行緒物件。
2,sleep(毫秒、納秒):控制當前執行緒休眠若干秒。(1秒 = 1000毫秒 = 1000000000納秒)
3,join():當前執行緒暫停,等待指定的執行緒執行結束後,當前執行緒再繼續執行。
4,setDaemon():設定一個執行緒為守護執行緒,該執行緒不會單獨執行,當其他非守護執行緒都執行結束後,自動退出
5,yield:讓出CUP
6,setPriority():設定執行緒優先順序
七,同步程式碼塊
1>運用場景:
當執行緒併發,有多個程式碼同時執行時,需要某一段程式碼執行過程中CPU不要切換到其他執行緒工作,就時需要同步程式碼塊。
如果兩段程式碼是同步的,那麼同一時間只能執行一段,在一段程式碼沒執行結束前,不會執行另一段程式碼。
2>同步程式碼塊:
使用synchronized關鍵字,新增一個鎖物件(任意)來定義一段程式碼,這就是同步程式碼塊。
多個同步程式碼塊如果使用相同的鎖物件,那麼他們就是同步的。
3>同步方法:
使用synchronized關鍵字,修飾一個方法,該方法中所有的程式碼都是同步的。
非靜態的同步方法的鎖物件是this。
而靜態的同步方法的鎖物件是該類的位元組碼物件(類名.class)。
八,單例設計模式
保證類在記憶體中只有一個物件。
1>設計方式
1,控制類的建立,不讓其他類來建立本類的物件。
2,在本類中定義一個本類的物件。
3,提供公共的訪問方式
餓漢式:
class Singleton{
//1,私有建構函式
private Singleton(){}
//2,建立本類物件
private static Singleton s = new Singleton();
//3,對外提供公共的訪問方式
public static Singleton getInstance(){
return s;
}
public static void print(){
System.out.println("123");
}
}
懶漢式:
class Singleton{
//1,私有構造方法
private Singleton(){}
//2,宣告一個引用
private static Singleton s ;
//3,對外提供公共的訪問方式
public static Singleton getInstance(){
if(s == null){
s = new Singleton();
}
return s;
}
public static void print(){
System.out.println("123");
}
}
2>餓漢式與懶漢式區別
1,餓漢式:記憶體空間換取訪問時間,多執行緒訪問時餓漢式不會建立多個物件。
2,懶漢式:訪問時間換取記憶體空間,多執行緒訪問時懶漢是可能建立多個物件。
九,主要方法
1,Runtime類,getRuntime():返回與當前Java應用程式相關的執行時物件。
2,Timer類,schedule():安排在指定的時間執行指定的任務。
十,執行緒間的通訊
1>應用環境
多個執行緒併發執行時,預設時CPU是隨機切換的,需要它有規律的執行時就應用通訊。
2>兩個執行緒間的通訊
1,使執行緒等待,呼叫wait();
2,使喚醒等待的執行緒,呼叫notifyAll();
這兩個方法必須在同步程式碼塊中執行,並且使用同步鎖物件來呼叫。
3>多個執行緒間的通訊
1,notify()方法是隨機喚醒一個執行緒。
2,notifyAll()方法是喚醒所有執行緒。
用notifyAll()通知所有執行緒,用while來反覆判斷條件
4>執行緒間的通訊注意事項
1,在同步程式碼塊中,使用哪個鎖物件,該鎖物件就呼叫wait()方法。
2,sleep()方法與wait()方法的區別:
a.sleep方法必須傳入引數,wait方法可傳可不傳。
b.sleep方法在同步程式碼塊中不釋放鎖。
wait方法在同步程式碼塊中釋放鎖。
十一,互斥鎖
1、同步: 使用ReentrantLock類的lock()和unlock()方法進行同步。
2、通訊: 使用ReentrantLock類的newCondition()方法獲取Condition物件;
需要等待的時候使用Condition的await()方法,喚醒使用signal()方法;
不同的執行緒使用不同的Condition,容易區分不同的執行緒。
十二,執行緒生命週期
[非原創圖,未知原作者,若有追究可侵刪]
十三,簡單工廠模式
1>概述
它定義一個具體的工廠類負責建立一些類的例項,又叫靜態工廠方法模式。
2>優缺點
優點:客戶端不需要再負責物件的建立,明確了各個類的職責。
缺點:簡單工廠模式負責所有物件的建立,若有新的物件增加,或者某些物件的建立方式不用,就需要不斷修改工廠類,不利於後期維護