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【返回模式】案例:模擬自動儲存檔案,當檔案沒有更改時,每隔一秒的自動儲存資料,真正儲存操作不執行。如果有修改,則執行真正儲存操作。
資料類:
/***view code*/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
}
多執行緒學習(四)
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...