多執行緒學習之四返回模式

2022-09-06 06:09:07 字數 3002 閱讀 9405

balking【返回模式】timed【超時模式】

一:balking pattern的參與者

--->guardedobject(被警戒的物件)

--->該模式的角色:模擬修改警戒物件的執行緒,當警戒條件達到執行具體操作的執行緒,參與者(被警戒的參與者)

二:balking pattern模式什麼時候使用

--->不需要刻意去執行什麼操作的時候(比如說自動儲存)

--->不想等待警戒條件成立時。(不讓執行緒休息)

--->警戒條件只有第一次成立時候。

三:balking pattern思考

--->balking pattern (返回模式)和guarded suspension pattern(等待喚醒模式)的中間

3.1guarded suspension當警戒條件不成立時,會等待,直到成立,並被喚醒。

3.2balking 當警戒條件不成立,退出。

3.3兩種極端的處理方式之間還有一種折衷的做法。在條件成立為止之前,等待一段時間,看看條件是否成立,如果不成立,則balk。這種方式稱之為guarded timed 或簡單稱之為timeout

---->執行緒類中的各個喚醒方法

3.1:當notify方法執行時==>如果wait set裡有多條執行緒,只有一條被喚醒

3.2:當notifyall方法執行時==>wait set裡有多少條執行緒都被喚醒。

3.3:interrupt方法執行時==>wait set裡的執行緒會(與呼叫notify,notifyall一樣)重新嘗試獲取鎖定。

==> notify,notifyall是對例項呼叫的,而interrupt是對執行緒呼叫的。關於中斷,後續會提到。

3.4:發生timeout時,由於wait(超時時間),和被notify或notifyall喚醒重新嘗試獲取鎖定,分不清楚,所以timeout需要程式設計師自己寫。

---->sleep和wait的區別有:

1,這兩個方法來自不同的類分別是thread和object

2,最主要是sleep方法沒有釋放鎖,而wait方法釋放了鎖,使得其他執行緒可以使用同步控制塊或者方法。

3,wait,notify和notifyall只能在同步控制方法或者同步控制塊裡面使用,而sleep可以在

任何地方使用

synchronized(x)

4,sleep必須捕獲異常,而wait,notify和notifyall不需要捕獲異常

5.wait被喚醒後,重新獲取鎖,從阻塞的**處繼續往下執行。和sleep一樣。

balking【返回模式】案例:模擬自動儲存檔案,當檔案沒有更改時,每隔一秒的自動儲存資料,真正儲存操作不執行。如果有修改,則執行真正儲存操作。

資料類:

/***  

*/package

com.benxq.thread5;

import

j**a.io.file;

import

j**a.io.filenotfoundexception;

import

j**a.io.fileoutputstream;

import

j**a.io.ioexception;

/*** created by qucf on 2023年10月22日. */

public

class

data

catch

(ioexception e)

}//修改內容

public

synchronized

void

updatecontent(string content)

//把新內容寫入檔案

public

void

s**e()

catch

(filenotfoundexception e)

catch

(ioexception e)

}//儲存內容

public

synchronized

void

s**enewcontent()

s**e();

system.out.println("執行緒"+thread.currentthread().getname()+"儲存內容成功");

flag=false

; }

}

view code

修改內容執行緒

/***  

*/package

com.benxq.thread5;

/*** created by qucf on 2023年10月22日. */

public

class changethread implements

runnable

@override

public

void

run()

catch

(interruptedexception e) }}

}

view code

自動儲存執行緒

/***  

*/package

com.benxq.thread5;

/*** 模擬儲存執行緒

* created by qucf on 2023年10月22日. */

public

class s**ethread implements

runnable

@override

public

void

run()

catch

(interruptedexception e) }}

}

view code

主線程

/***  

*/package

com.benxq.thread5;

/*** created by qucf on 2023年10月22日. */

public

class

test

}

view code

多執行緒學習(四)

boost shared mutex 這個配合boost shared lock類這個相當於讀鎖 巢狀鎖不是乙個很好的選擇,盡量嘗試更改資料結構 條件和期望 執行緒會等待乙個特定事件的發生,或者等待某一條件達成。這可能定期檢查任務完成。需要進行同步,可以利用期望和條件達成同步。例子如下 class ...

多執行緒學習 執行緒同步 四

問題 子執行緒迴圈10次,回到主線程執行100次,接著又回到子執行緒執行10次,再回到主線程執行100次,如此迴圈50次,該如何實現?public class threadcommunicationstudy start for int i 1 i 50 i 資源類 class bussiness ...

多執行緒學習筆記四

執行緒範圍內的資料共享 time 上午10 10 13 author retacn yue email zhenhuayue sina.com public class threadlocaltest start 存放全域性變數 time 上午10 27 49 author retacn yue e...