1. 程式人生 > >20 Java基礎筆記-執行緒

20 Java基礎筆記-執行緒

執行緒

一,程式,程序,執行緒

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>優缺點

優點:客戶端不需要再負責物件的建立,明確了各個類的職責。
缺點:簡單工廠模式負責所有物件的建立,若有新的物件增加,或者某些物件的建立方式不用,就需要不斷修改工廠類,不利於後期維護