導航:首頁 > 編程語言 > threadjavawait

threadjavawait

發布時間:2022-02-28 08:17:31

java Thread 的 sleep 和 wait 的區別

(1)sleep是讓線程休眠,必須給定休眠的時間,時間到了後自動醒來,不需要喚醒,休眠時不放棄cpu的執行權
(2)wait是讓線程等待,可以給時間,也可以不等時間,但是必須要喚醒才能醒來(使用notify或者notifyAll),等待時放棄cpu的執行權
(3)sleep方法是Thread類中定義的方法,wait是Object中定義的方法
(4)wait用在同步代碼塊或者同步方法中,sleep可以在任何地方使用
(5)sleep必須捕獲異常,wait不用捕獲異常

Ⅱ java線程,wait()方法怎麼把自己給停掉了

Thread.currentThread().wait() //引用當前的線程

Ⅲ java多線程關於Thread實例對象執行wait方法的問題

wait()方法只是讓當前線程(t1調用的,就是t1線程)在當前時間片不搶佔cpu,但下一個時間片該搶還是搶
正常都是子線程執行完,主線程才繼續執行,所以t1執行完,主線才會執行,而且是沒有障礙地執行
最後你那個同步鎖沒什麼用,因為沒有線程跟主線程搶著執行同步塊里的內容

Ⅳ Java Thread BLOCKED和WAITING兩種狀態的區別

BLOCKED狀態
線程處於BLOCKED狀態的場景。
當前線程在等待一個monitor lock,比如等待執行synchronized代碼塊或者使用synchronized標記的方法。
在synchronized塊中循環調用Object類型的wait方法,如下是樣例
synchronized(this)
{
while (flag)
{
obj.wait();
}
// some other code
}
WAITING狀態
線程處於WAITING狀態的場景。
調用Object對象的wait方法,但沒有指定超時值。
調用Thread對象的join方法,但沒有指定超時值。
調用LockSupport對象的park方法。
提到WAITING狀態,順便提一下TIMED_WAITING狀態的場景。
TIMED_WAITING狀態
線程處於TIMED_WAITING狀態的場景。
調用Thread.sleep方法。
調用Object對象的wait方法,指定超時值。
調用Thread對象的join方法,指定超時值。
調用LockSupport對象的parkNanos方法。
調用LockSupport對象的parkUntil方法。

Ⅳ java線程wait(),notify()問題,以下是代碼

把生產者的run方法這樣寫:
public void run() {
int n = 0;
while (n <= 10) {
n++;
q.put(n);
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}

其實沒什麼特殊的,我只似乎讓生產者每次生產出來一個東西之後稍稍睡一會,然後你在run一下看看效果,應該是每隔1s就會輸出一次,一共11次。

你的代碼本身沒有問題,問題在於要知道當put方法裡面notify的時候,你不會知道它會喚醒那個線程,這個完全是jvm看自己心情決定的,那麼就會出現的情況是生產者跑的飛快,它可能一下子就把11次循環都跑完,然後最後一次notify完了之後以後都不會在notify了,剩下一個消費者可憐巴巴的wait,可是永遠不會有人notify他了,然後就over了。

可能你不是很明白我說的意思,你按照我說的把代碼改一下,然後自己思考一下,這個東西會有一個頓悟的過程,可能你一時想不明白,但是將來可能一下子就明白我的意思了。

BTW,java多線程其實還是比較復雜的,讓各個線程在你的腦子裡面跑起來,你如果能在自己腦子裡面模擬多個線程一起跑,你就會比較容易想明白。

另外,多線程的代碼debug不能給你提供什麼幫助,我也有同事喜歡用debug調試多線程的程序,我對此頗為不屑,因為如果你在run裡面設置了斷點,那麼我可以說,你永遠都不會知道多線程是怎麼回事,一定要在自己腦子裡面想才行,實際上我讓線程sleep一會實際上相當於是加一個1s的斷點,1s後斷點取消,程序繼續跑,這個可以幫助你理解。

Ⅵ java thread wait問題

public class ThreadTest {
public static void main(String[] args) throws Exception{
Thread t = Thread.currentThread();
for(int i =0;i<20;i++){
if(i==12){
synchronized (t) {
try {
t.wait();
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
System.out.println("main---->"+i);
}
}
}
你用這代碼試試
你搞錯對象了

Ⅶ JAVA線程wait()方法問題

應該使用wait(),wait 方法的解釋是
Causes current thread to wait until another thread invokes the notify() method or the notifyAll() method for this object.

舉個例子:
比如你有一個Depository 類的對象 d ,然後線程A要訪問d的addLast()方法,
因為這個addLast()方法時synchronized 所以線程A進入的時候就給這個對象d 加上鎖,其它線程不允許訪問,當執行到wait()時,線程A就會先打開對象A的鎖,並在對象d 外面排隊等待。

對於IllegalMonitorStateException,我的理解是:
一個對象的wait()方法只能在此對象的同步方法中被調用,意思是,這個對象在wait前是被加了鎖的。

你將addLast方法的synchronized 去掉運行也會拋出這樣的異常。

所以說你用wait()就可以了。
Thread.currentThread().wait();這句話調用的是當前線程對象的wait()方法,
當前線程對象沒有被加鎖。所以出錯。

個人理解,僅供參考,希望能幫到你

Ⅷ java 的 Thread.sleep() 和 Thread.wait() 的區別

共同點: 他們都是在多線程的環境下,都可以在程序的調用處阻塞指定的毫秒數,並返回。

不同點: Thread.sleep(long)可以不在synchronized的塊下調用,而且使用Thread.sleep()不會丟失當前線程對任何對象的同步鎖(monitor);
object.wait(long)必須在synchronized的塊下來使用,調用了之後失去對object的monitor, 這樣做的好處是它不影響其它的線程對object進行操作。

Ⅸ java線程wait方法

  1. wait和notify是用在多線程競爭同一鎖資源的情況下使用的。

  2. 你這段代碼實際是個單線程,這個線程自己把自己阻塞了,自然不可能自己把自己喚醒。

  3. 你的意圖怎麼實現呢?需要加入另外一個線程,下面是我仿照你的意圖寫的一段代碼,供參考下



  4. 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高人解答Java Thread,Wait的問題,問題如圖,多謝,紅色部分難以理解,請詳解!

這是一個很明顯的,線程不安全的問題
因為你在子線程里修改了這個 i 的值,也就是說,當你線程1 wait()的時候 i 的值還是大於0的
這時候線程2和線程3還是會繼續循環
結果線程2和線程3又wait()了等線程2notify()的時候,i的值已經是0了結果i--
然後是線程3又notify()了,這時候i的值本來已經是-1結果是-2了,很明顯的

閱讀全文

與threadjavawait相關的資料

熱點內容
優信二手車解壓後過戶 瀏覽:63
Windows常用c編譯器 瀏覽:780
關於改善國家網路安全的行政命令 瀏覽:835
安卓如何下載網易荒野pc服 瀏覽:656
javainetaddress 瀏覽:106
蘋果4s固件下載完了怎麼解壓 瀏覽:1005
命令zpa 瀏覽:288
python編譯器小程序 瀏覽:946
在app上看視頻怎麼光線調暗 瀏覽:542
可以中文解壓的解壓軟體 瀏覽:595
安卓卸載組件應用怎麼安裝 瀏覽:915
使用面向對象編程的方式 瀏覽:341
程序員項目經理的年終總結範文 瀏覽:932
內衣的加密設計用來幹嘛的 瀏覽:435
淮安數據加密 瀏覽:295
魔高一丈指標源碼 瀏覽:984
松下php研究所 瀏覽:170
c回調java 瀏覽:403
夢幻端游長安地圖互通源碼 瀏覽:747
電腦本地文件如何上傳伺服器 瀏覽:315