国产xxxx99真实实拍_久久不雅视频_高清韩国a级特黄毛片_嗯老师别我我受不了了小说

資訊專欄INFORMATION COLUMN

java并發(fā)編程學習之線程的生命周期-wait,notify,notifyall(六)

Terry_Tai / 3026人閱讀

摘要:不釋放持有的鎖,釋放鎖。在調(diào)用方法前,必須持有鎖,調(diào)用喚醒,也要持有鎖。休眠一定時間后,進入就緒狀態(tài)。這兩個都能被方法中斷當前狀態(tài)。用法方獲取鎖判斷條件,不滿足繼續(xù)滿足執(zhí)行其他業(yè)務方獲取鎖改變條件通知為什么是而不是會一直循環(huán),直到條件滿足。

sleep和wait

sleep是Thread類的方法,wait是Object的方法。

sleep可以到處使用,wait必須是在同步方法或者代碼塊里使用,不然會有java.lang.IllegalMonitorStateException異常。

sleep不釋放持有的鎖,wait釋放鎖。wait在調(diào)用方法前,必須持有鎖,調(diào)用notify,notifyall喚醒,也要持有鎖。

sleep休眠一定時間后,進入就緒狀態(tài)。wait由notify和notifyall喚醒。這兩個都能被interrupt方法中斷當前狀態(tài)。

join和yield

這兩個和sleep一樣,不釋放持有的鎖。

示例
public class WaitDemo {
    private String tv = "廣告";

    static class Tv extends Thread {
        WaitDemo waitDemo;

        public Tv(WaitDemo waitDemo) {
            this.waitDemo = waitDemo;
        }

        @Override
        public void run() {
            waitDemo.waitTv();
        }
    }

    public synchronized void waitTv() {
        while (tv.equals("廣告")) {
            try {
                wait();
                if (tv.equals("廣告")) {
                    System.out.println(Thread.currentThread().getName() + "-" + "騙人,還是廣告");
                }
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
        System.out.println(Thread.currentThread().getName() + "-" +"愉快的追劇");
    }

    public synchronized void sendTrueMsg() {
        tv = "正劇";
        notifyAll();
    }

    public synchronized void sendFalseMsg() {
        notifyAll();
    }

    public static void main(String[] args) throws InterruptedException {
        WaitDemo waitDemo = new WaitDemo();
        Tv tv1 = new Tv(waitDemo);
        Tv tv2 = new Tv(waitDemo);
        tv1.start();
        tv2.start();
        Thread.sleep(100);
        waitDemo.sendFalseMsg();
        Thread.sleep(100);
        waitDemo.sendTrueMsg();
    }
}

運行的結(jié)果如下:

例子:大部分人喜歡看連續(xù)劇,但是不看廣告(沒錢買VIP),于是就讓別人提醒她廣告結(jié)束了沒有,如果結(jié)束了,就提醒她。
用法:

wait方

獲取鎖

while判斷條件,不滿足繼續(xù)wait

滿足執(zhí)行其他業(yè)務

notify方

獲取鎖

改變條件

通知

為什么是while而不是if

while會一直循環(huán),直到條件滿足。如果是if,只會判斷一次,如果不滿足條件,會一直等待

為什么是notifyAll而不是notify

可以把上面的例子,改成notify,那么進程永遠不會結(jié)束,因為在多線程情況下,notify只能喚醒隨機的一個休眠線程,其他已休眠的線程不能喚醒,造成信號不能傳達而丟失,而notifyAll可以喚醒所有的。

文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請注明本文地址:http://specialneedsforspecialkids.com/yun/75252.html

相關(guān)文章

  • 一起并發(fā)編程 - 等待與通知

    摘要:如果有其它線程調(diào)用了相同對象的方法,那么處于該對象的等待池中的線程就會全部進入該對象的鎖池中,從新爭奪鎖的擁有權(quán)。 wait,notify 和 notifyAll,這些在多線程中被經(jīng)常用到的保留關(guān)鍵字,在實際開發(fā)的時候很多時候卻并沒有被大家重視,而本文則是對這些關(guān)鍵字的使用進行描述。 存在即合理 在java中,每個對象都有兩個池,鎖池(monitor)和等待池(waitset),每個...

    Meathill 評論0 收藏0
  • java并發(fā)編程習之線程生命周期-interrupt(七)

    摘要:和是配套使用的,方法容易導致死鎖。方法不會保證線程的資源正常釋放方法給線程打個停止標記,將線程的中斷狀態(tài)設置為,并沒有馬上強制中斷線程,線程是否中斷由線程自己決定。終結(jié)狀態(tài),還是返回。方法判斷當前線程是否中斷,清除中斷標志。 resume、suspend、stop resume和suspend是配套使用的,suspend方法容易導致死鎖。 stop方法不會保證線程的資源正常釋放 i...

    maxmin 評論0 收藏0
  • Java并發(fā)總結(jié)

    摘要:限期阻塞調(diào)用方法等待時間結(jié)束或線程執(zhí)行完畢。終止狀態(tài)線程執(zhí)行完畢或出現(xiàn)異常退了。和都會檢查線程何時中斷,并且在發(fā)現(xiàn)中斷時提前放回。工廠方法將線程池的最大大小設置為,而將基本大小設置為,并將超時大小設置為分鐘。 wait()、notify()、notifyAll() Object是所有類的基類,它有5個方法組成了等待、通知機制的核心:notify()、notifyAll()、wait()...

    szysky 評論0 收藏0
  • java并發(fā)編程習之線程生命周期(一)

    摘要:就緒狀態(tài)調(diào)用或者由阻塞狀態(tài)被解除時,進入就緒狀態(tài),此時,只能表示線程可以運行了,但不代表已經(jīng)運行了,需要等待的調(diào)度。死亡狀態(tài)當線程執(zhí)行結(jié)束或者異常等,線程就會結(jié)束,進入死亡狀態(tài)。 流程圖 showImg(https://segmentfault.com/img/bVbuJ6f); 新建狀態(tài) 當用new創(chuàng)建一個線程后,線程就處于新建狀態(tài),此時和其他普通java對象一樣,由JVM創(chuàng)建內(nèi)存空...

    AndroidTraveler 評論0 收藏0
  • Java線程習(四)等待/通知(wait/notify)機制

    摘要:運行可運行狀態(tài)的線程獲得了時間片,執(zhí)行程序代碼。阻塞的情況分三種一等待阻塞運行的線程執(zhí)行方法,會把該線程放入等待隊列中。死亡線程方法執(zhí)行結(jié)束,或者因異常退出了方法,則該線程結(jié)束生命周期。死亡的線程不可再次復生。 系列文章傳送門: Java多線程學習(一)Java多線程入門 Java多線程學習(二)synchronized關(guān)鍵字(1) java多線程學習(二)synchronized關(guān)鍵...

    PiscesYE 評論0 收藏0

發(fā)表評論

0條評論

最新活動
閱讀需要支付1元查看
<