A. 誰能幫我解釋一下java線程中的wait()方法的作用與執行原理非常感謝!
wait()方法是抄java.lang.Object類韋線程提供的用於實現線程間通信的同步控制方法。wait()方法使當前線程主動釋放互斥鎖,並進入該互斥鎖的等待隊列。(也就是說,它使當前線程暫停執行,等待其他線程執行notify()方法或者notifyall()方法後再繼續執行本線程。)本方法用於釋放一個項目的線程,喚醒另一個可能在等待的線程。有兩種調用格式:
1.wait()等待通信線程喚醒後再繼續執行本線程。
2.wait(long millis)等待通信線程喚醒或者最多等待millis毫秒後,再繼續執行本線程。
我知道的就這么多了哈,希望對你能有一點幫助哦~~
B. java中wait方法是什麼意思
wait方法用在 synchronized 方法或者 synchronized塊中。
一般在判斷語句中,如果某條件被觸發,讓當前線程wait並釋放對象的鎖。
此時可以讓其他線程可以對用以對象調用synchronized方法。
直到調用 notify或者notifyAll後 wait的線程才有可能執行。
所以一般wait 和 notify是成對出現的。
有點復雜,去看看線程同步有關的東西吧。
C. Java線程wait問題
java的每一個實例對象都有一個等待隊列和一個對象鎖,任何一個線程要想調用該對象的wait()方法進入該對象的等待隊列,就必須先通過synchronized()方法獲得當前對象的鎖,先說你的第一個問題,兩個線程通過synchronized()方法獲得的是str對象的鎖,但是你在調用wait()方法的時候,默認情況下調用的是this對象的wait()函數,但是當前線程並沒有獲得this對象的鎖,當然會報錯,如果我沒猜錯,改成this.str.wait()和this.str.notifyAll()應該就會好了。第二個問題,也是這樣,你確實獲得了 鎖,但是注意,你獲得的是str對象的鎖,不是this對象的鎖,所以在你調用notifyAll()方法的時候,會出現一個異常,因為你調用的是this對象的notifyAll()方法,而this對象的等待 隊列壓根就是空的,因為沒有任何一個線程獲得它的對象鎖,所以才會報錯,當然了,你把synchronized()方法的參數改成this,肯定不會報錯了。
D. java 多線程的方法問題 join(); sleep();wait();這些方法有什麼區別這樣看好像都是阻塞啊
sleep是線程類(Thread)的方法,導致此線程暫停執行指定時間,把執行機會給其他線程,但是監版控狀態依然保持,到權時後會自動恢復。調用sleep不會釋放對象鎖。
wait是Object類的方法,對此對象調用wait方法導致本線程放棄對象鎖,進入等待此對象的等待鎖定池,只有針對此對象發出notify方法(或notifyAll)後本線程才進入對象鎖定池准備獲得對象鎖進入運行狀態。
join就是阻塞調用線程,直到該線程結束後,調用線程才能繼續執行。
強制運行join後的線程。
E. JAVA中線程同步方法有哪些
JAVA中線程同步的概念在同一個線程運行 前面的運行完在運行後面的 有先後順序 ,簡單的講就是版像排隊一樣有權先後順序。
同步的方法有下面3種;
1,wait方法:
該方法屬於Object的方法,wait方法的作用是使得當前調用wait方法所在部分(代碼塊)的線程停止執行,並釋放當前獲得的調用wait所在的代碼塊的鎖,並在其他線程調用notify或者notifyAll方法時恢復到競爭鎖狀態(一旦獲得鎖就恢復執行)。
2 notify方法和notifyAll方法:
notify方法通知調用了wait方法,但是尚未激活的一個線程進入線程調度隊列(即進入鎖競爭),注意不是立即執行。並且具體是哪一個線程不能保證。另外一點就是被喚醒的這個線程一定是在等待wait所釋放的鎖。
notifyAll方法則喚醒所有調用了wait方法,尚未激活的進程進入競爭隊列。
3。 synchronized關鍵字:
synchronized用來標識一個普通方法時,表示一個線程要執行該方法,必須取得該方法所在的對象的鎖。
根據項目的需求,選擇有哪一種方法好一些。
F. Java多線程 為什麼加了wait()函數 運行結果就和想像中的不同了
根據原理:通過對一個線程調用wait()函數後,線程就進入停滯狀態。通過調用notify()可以喚起線程。
沒有注銷wait時的代碼流程如下
write線程流程:
1、如果ThreadDmeo.hasdate == false,將線程停滯;
2、如果ThreadDmeo.hasdate == true,輸出一個隨機數,並將ThreadDmeo.hasdate設置為false,再將線程喚醒。
read線程流程如下:
1、如果ThreadDmeo.hasdate == true,將線程停滯;
2、如果ThreadDmeo.hasdate == false,讀取ThreadDmeo.date,並將ThreadDmeo.hasdate設置為true。
從上面流程可以看出,只要被設置為停滯,線程A(假設為兩線程中的任意一個)就不會被再次拉起。雖然這個時候,另外一個線程B可能將ThreadDmeo.hasdate標志重置,但並沒有使用notify函數通知線程A啟動。因此,最終兩個線程都會停滯,因此當然只能讀寫一個數了。