學習日記之多執行緒

2021-08-05 22:11:08 字數 2948 閱讀 4761

要學習執行緒,首先要理解三個概念。什麼是程式,什麼是程序,什麼是執行緒。程式,是指令的集合。程序是正在執行的程式,是靜態概念。執行緒,是程序中乙個「單一的連續控制流程」,也稱為輕量級程序。、

執行緒有一下幾個點:

1. 乙個程序可以擁有多個執行緒

2. 乙個程序中的執行緒個共享相同的記憶體單元,即擁有相同的變兩個物件,而且他們從同乙個堆中分配物件、通訊、資料交換等。

3. 由於執行緒的通訊在同一位址,所以通訊更簡便,資訊傳送速度也更快。

多執行緒的實現有兩種方法:

1.整合thread類重寫run()方法。

2.實現runnable介面重寫run()方法。

例子如下:

public

class

threaddemo

}class

counteven

extends

thread catch (interruptedexception e)

system.out.println("2: " + j);}}

}class

countodd

implements

runnable catch (interruptedexception e)

system.out.println("1: " + i);}}

}

這兩種方式各有優缺點。第一種方式直接繼承thread,可以避免多執行緒共享資源引發的併發問題。但是每開啟乙個執行緒都需要new乙個新的執行緒物件。第二種方式只需要乙個new執行緒物件,之後可以通過共享這乙個執行緒物件實現開啟多個執行緒。就如**中new thread(ct)中的「ct」。由於資源共享,執行緒之間通訊更加便捷,資訊傳送速度也更快,但與此同時單個執行緒對物件的更改對其他執行緒來說很容易引發一些問題。

新生狀態:執行緒剛被new出來的狀態;

就緒狀態:執行緒物件呼叫start之後,或者由阻塞狀態被喚醒或者自己醒來後,程等待cpu排程的狀態;

執行狀態:執行緒獲得cpu排程之後的狀態,在此狀態下可以呼叫yield方法(使當前執行緒暫時等待一下)使執行緒重新回到就緒狀態。

阻塞狀態:當執行狀態的執行緒遇到導致阻塞狀態的事件(例如wait、sleep和join等)會使執行緒放棄cpu資源進入阻塞狀態。其中wait是使當前執行緒等待,直到有其他執行緒呼叫notify喚醒;sleep睡眠制定時間,自動「醒來」;join是當其他執行緒呼叫join方法「插隊」迫使當前執行緒等待,直到join執行緒完成才會進入就緒狀態。

死亡狀態:執行緒執行至結束的狀態。

需要注意的是,執行緒由執行狀態被阻塞而進入阻塞狀態後,無論是被喚醒還是自己醒來都會重新進入就緒狀態等待cpu排程。只有執行緒呼叫yield方法才會由執行狀態直接回到就緒狀態。

這裡的同步,我的理解是不是指同乙個步子,一起怎麼樣,而是乙個乙個來做事情。實現執行緒同步使用synchronized關鍵字。有兩種實現方法:

1.同步**塊。

在方法中使用synchronized關鍵字「鎖」住某一物件其他執行緒只有拿到被鎖物件的鎖才能進行操作。

2.同步方法

直接用關鍵字synchronized修飾方法,使方法每次只能有乙個執行緒訪問,也就是執行緒都必須拿到方法的鎖才能訪問方法,訪問時獨佔方法,其他執行緒不可訪問。

同步方法實現交替列印:

public

class

print

// 列印字母方法

public

synchronized

void

print(char c) catch (interruptedexception e)

}system.out.println(c);

index++;

try catch (interruptedexception e) ;

notifyall();

}// 列印數字方法

public

synchronized

void

print(int i) catch (interruptedexception e)

}system.out.print(i+" ");

index++;

try catch (interruptedexception e) ;

notifyall();

}}class pz implements runnable

// 列印字母

@override

public

synchronized

void

run()

}}// 列印數字

class pi implements runnable

@override

public

synchronized

void

run()

}}

同步**塊實現物件上鎖:
/**

* 1.設計乙個多執行緒的程式如下:設計乙個火車售票模擬程式。 假如火車站要有100張火車票要賣出,現在有5個售票點同時售票,

* 用5個執行緒模擬這5個售票點的售票情況。

* */

public

class

ticket

implements

runnable

public

void

run() catch (interruptedexception e)

//同步**塊

synchronized (num) catch (interruptedexception e)

} else }}

}}

使用同步能夠避免資源共享帶來的併發問題。同步**塊效率高但是由於只鎖住了**塊,方法還是會有多個執行緒訪問,所以不如同步方法安全,但是同步方法只能乙個乙個訪問方法,導致效率低下。

這就是多執行緒學習的一些理解,與大家分享。

python之多執行緒(學習)

執行緒分為 核心執行緒 由作業系統核心建立和撤銷 使用者執行緒 不需要核心支援而在使用者程式中實現的執行緒python3 執行緒中常用的兩個模組 thread和threading 推薦使用 python中使用執行緒有兩種方式 函式或者用類來包裝執行緒物件函式式 呼叫模組 import thread ...

iPhone學習之多執行緒筆記

程序 正在執行的程式 執行緒 是對程序的細化,乙個程序包含一到多個執行緒 多執行緒大大提高了工作效率 多執行緒 concurrent 併發 單執行緒 serid 序列 執行緒同步 任務之間有依賴關係,乙個任務執行完後,另乙個任務才能執行.執行緒互斥 可以用nslock 程序鎖 解決 ui介面重新整理...

Qt之多執行緒簡單學習

qt中建立執行緒的方法 只需要子類化qthread並重新實現它的run 函式就可以了。run 是個純虛函式,是執行緒執行的入口,在run 裡出現的 將會在另外執行緒中被執行。run 函式是通過start 函式來實現呼叫的。下面是我學習時的例子 工程檔案 介面效果 執行效果 stopped被宣告為易失...