執行緒間的通訊方法

2021-10-06 09:30:07 字數 2790 閱讀 5221

我們可以使用鎖來保證同步。

如果不同步的話,多個執行緒start後,他們的執行時間和順序是不確定的。

同步的意思就是 人為的確定 執行緒間的執行順序; 可以用加 鎖來解決。

用 synchronized 關鍵字,可同步方法 或者 **塊。

在用鎖的時候,如果我們訪問的物件是被鎖起來了的,這時就是處於阻塞狀態

我們就需要不斷的重新去嘗試,直到拿到鎖為止,這樣就比較消耗效能和資源。

可以用 等待 和 通知解決:object 的 wait()、 notify()、 notifyall()

wait() 使乙個執行緒進入 無限等待 或 限時等待 狀態,同時會 釋放鎖。wait()必須放在同步塊 或 同步方法中。

notify() 用來隨機喚醒乙個處於 無限等待 或 限時等待 狀態的執行緒。

notifyall() 用來喚醒 所有處於 無序等待 或 限時等待 狀態的執行緒。

注意:他們作用的物件要是同一把鎖,否則這把鎖也是沒有用的。

可以用 volatile 關鍵字來實現訊號量通訊。

volatile 關鍵字:

可以保證記憶體的可見性,

也就是用 volatile 宣告的變數,在以乙個執行緒改變了之後,其他執行緒使立馬可以看見改變後的值的。

public

class

signal}}

}}static

class

threadb

implements

runnable}}

}}public

static

void

main

(string[

] args)

}

注意: signal++ 或 signal = signal + 1 並不是乙個原子操作。

訊號量的應用場景:

在多個執行緒(2個執行緒以上)進行通訊時,用訊號量機制就比較方便了。

是一種基於 管道流 的通訊方法。

jdk 裡提供了有 基於字元的: pipedreader 、 pipedwriter、

也有 基於位元組的: pipedoutoutstream、 pipedinputstream 類。

public

class

pipe

@override

public

void

run()}

catch

(ioexception e)}}

static

class

writerthread

implements

runnable

@override

public

void

run(

)catch

(ioexception e)

finally

catch

(ioexception e)}}

}public

static

void

main

(string[

] args)

throws interruptedexception, ioexception

}

應用場景:

在當前執行緒呼叫另乙個執行緒的 join() 方法,就會使當前執行緒進入 無限時等待 或 限時等待 狀態,

直到另乙個執行緒的 任務執行完畢,當執行緒才會繼續往下執行。

public

class

join

catch

(interruptedexception e)}}

public

static

void

main

(string[

] args)

throws interruptedexception

}

嚴格來說, threadlocal 類並不屬於 執行緒間的通訊範疇,只是他可以儲存各個獨自有的執行緒的變數,不被其他執行緒影響。

內部是乙個 弱引用的 map 來維護。最常用的 set()、get()方法。

當然可以用私有變數來解決,但這樣用 threadlocal 類後,可以將靜態變數和 執行緒的狀態 關聯起來。

應用場景:

資料庫的鏈結,session的管理,有著大量複雜物件的初始化和關閉,

就可以用 類的靜態變數來時執行緒更為 「輕量」 些。

public

class

threadlocaldemo

@override

public

void

run(

)catch

(interruptedexception e)

system.out.

println

("threada輸出:"

+ threadlocal.

get())

;}}static

class

threadb

implements

runnable

@override

public

void

run()}

public

static

void

main

(string[

] args)

}

inheritablethreadlocal : 他的子執行緒也可以訪問這個副本值。

執行緒間的通訊

執行緒間的通訊 簡單說明 執行緒間通訊 在1個程序中,執行緒往往不是孤立存在的,多個執行緒之間需要經常進行通訊 執行緒間通訊的體現 1個執行緒傳遞資料給另1個執行緒 在1個執行緒中執行完特定任務後,轉到另1個執行緒繼續執行任務 執行緒間通訊常用方法 06 nsthread04 執行緒間通訊 impo...

執行緒間的通訊

1.執行緒間的通訊 多個執行緒處理同乙個資源,但處理的動作卻不同 2.執行緒間的有效通訊 使用等待喚醒機制,實現協調通訊,讓執行緒間進行有規律的執行 3.條件 3.1 wait方法與notify方法必須由同乙個鎖物件呼叫,因為,對應的鎖物件可以通過notify喚醒使用同乙個物件呼叫的wait方法後的...

執行緒間的通訊

常用的 wait notify notifyall 在乙個執行緒裡面,喚醒其他擁有同樣的鎖的執行緒 使用wait notify notifyall 時,塊必須上鎖 author fzz public class communicate catch interruptedexception e sys...