Ⅰ JAVA程序中有a,b兩個線程,當a調用wait方法進入等待狀態後,b用notify方法
這個是不確定,雙線程都有可能執行到。如果短期類線程執行完畢,有很大可能只執行其中的某一個線程,你可以把線程執行時間調長點就能看到結果了(如在線程中加上for 循環,循環時間長點)
Ⅱ java線程wait方法
wait和notify是用在多線程競爭同一鎖資源的情況下使用的。
你這段代碼實際是個單線程,這個線程自己把自己阻塞了,自然不可能自己把自己喚醒。
你的意圖怎麼實現呢?需要加入另外一個線程,下面是我仿照你的意圖寫的一段代碼,供參考下
publicclassA
{
publicA(){
finalAa=this;
Threadth1=newThread(){
@Override
publicvoidrun(){
//一直循環,去嘗試著喚醒a
try
{
this.sleep(10000);
}catch(InterruptedExceptione)
{
//TODOAuto-generatedcatchblock
e.printStackTrace();
}//為檢查是不是能真正實現喚醒a,等待10000毫秒,此時保證a已經處於等待狀態中。
while(true){
/**
*用notify喚醒的線程必須是持有當前鎖對象的線程
*/
synchronized(a){
a.notify();
}
}
}
};
th1.setDaemon(true);//這句也是必須的,將th1設為守護線程,保證在喚醒a以後,所有活動的線程都為守護線程,jvm能及時推出
th1.start();//和a.run的順序不可以換
this.run();
}
publicstaticvoidmain(String[]args)
{
newA();
}
publicvoidrun()
{
/**
*這里可以換成這樣,直接鎖住this就行了
*/
synchronized(this)
{
try
{
this.wait();//阻塞當前的線程
}catch(InterruptedExceptione)
{
//TODOAuto-generatedcatchblock
e.printStackTrace();
}finally{
System.out.println("1");//執行finally
}
}
}
}
Ⅲ java中怎樣使用線程在調用一個函數後過幾秒鍾再調用另一個函數
應該有必要開啟一個新的線程去監視isover線程是否結束,
一來 可以解決線程isover因為執行時間過長導致超時的問題
而來 也能通過監測isover線程的狀態來實現線程結束再做其他處理的問題!
1、如果一個線程調用了某個對象的wait方法,那麼該線程進入到該對象的等待池中(並且已經將鎖釋放),
如果未來的某一時刻,另外一個線程調用了相同對象的notify方法或者notifyAll方法,
那麼該等待池中的線程就會被喚起,然後進入到對象的鎖池裡面去獲得該對象的鎖,
如果獲得鎖成功後,那麼該線程就會沿著wait方法之後的路徑繼續執行。注意是沿著wait方法之後
2.如果沒有直接性的調用同類里的其他介面,或者返回,結束等java關鍵字,代碼還是得往下執行的。
Ⅳ 線程調用wait方法,再在別的線程調用notify方法的問題
java裡面wait是使當前線程進入等待狀態 並非是終止釋放
當其他線程調用notify時 wait繼續工作 當然這個也只是僅限制在同一監視器 呵呵!
但是這個具體要看你怎麼寫的 才能知道是不是從頭執行 多線程時 可能 你這個wait等待時是10 別的線程執行一段時間以後 這個線程被notify時 可能從100開始執行 當然也可能不變 就是線程間互不通信
下次 最好能把你寫的代碼發上來 詳細分析。
Ⅳ java執行了wait()方法,為什麼還能夠正常的運行run方法內的代碼
你wait()掛起的是主線程,run()方法是在thread1線程內執行,兩者不沖突。
Ⅵ 在Java中直接調用wait()方法時,請問是讓哪個線程進入等待呢
main()所在的線程,這個線程包括一個Object對象,你需要在Object中啟用notify()才可以重新喚醒
Ⅶ java 中1、一個線程調用了wait(),隨後被notify()喚醒,這個線程會接著執行wait
1、如果一個線程調用了某個對象的wait方法,那麼該線程進入到該對象的等待池中(並且已經將鎖釋放),
如果未來的某一時刻,另外一個線程調用了相同對象的notify方法或者notifyAll方法,
那麼該等待池中的線程就會被喚起,然後進入到對象的鎖池裡面去獲得該對象的鎖,
如果獲得鎖成功後,那麼該線程就會沿著wait方法之後的路徑繼續執行。注意是沿著wait方法之後
2.如果沒有直接性的調用同類里的其他介面,或者返回,結束等java關鍵字,代碼還是得往下執行的。
Ⅷ java多線程關於Thread實例對象執行wait方法的問題
wait()方法只是讓當前線程(t1調用的,就是t1線程)在當前時間片不搶佔cpu,但下一個時間片該搶還是搶
正常都是子線程執行完,主線程才繼續執行,所以t1執行完,主線才會執行,而且是沒有障礙地執行
最後你那個同步鎖沒什麼用,因為沒有線程跟主線程搶著執行同步塊里的內容
Ⅸ 在synchronize代碼塊中調用wait後還會繼續執行後續的代碼嗎
wait是讓使用wait方法的對象等待,暫時先把對象鎖給讓出來,給其它持有該鎖的對象用,其它對象用完後再告知(notify)等待的那個對象可以繼續執行了,因此,只有在synchronized塊中才有意義(否則,如果大家並不遵循同步機制,那還等誰呢?根本沒人排隊,也就談不上等待和喚醒了)
以下是一個例子,用以展示這種機制:
publicclassThreadA{
publicstaticvoidmain(String[]args){
ThreadBb=newThreadB();
b.start();//主線程中啟動另外一個線程
System.out.println("bisstart....");
//括弧里的b是什麼意思,應該很好理解吧
synchronized(b){
try{
System.out.println("Waitingforbtocomplete...");
b.wait();//這一句是什麼意思,究竟誰等待?
System.out.println("ThreadBisCompleted.Nowbacktomainthread");
}catch(InterruptedExceptione){}
}
System.out.println("Totalis:"+b.total);
}
}
classThreadBextendsThread{
inttotal;
publicvoidrun(){
synchronized(this){
System.out.println("ThreadBisrunning..");
for(inti=0;i<=100;i++){
total+=i;
}
System.out.println("totalis"+total);
notify();
}
}
}
Ⅹ JAVA中,我在類中自己定義了一個方法,然後直接調用了wait()方法,請問是讓哪個線程等待呢
主線程main()