色yeye在线视频观看_亚洲人亚洲精品成人网站_一级毛片免费播放_91精品一区二区中文字幕_一区二区三区日本视频_成人性生交大免费看

當前位置:首頁 > 嵌入式培訓 > 嵌入式學習 > 講師博文 > Object中有哪些公共方法及作用

Object中有哪些公共方法及作用 時間:2019-05-27      來源:華清遠見

大家在學習java的時候,一定遇到過Object類,因為在java單一繼承體系中Object類是根類,所有的類都會繼承它,并擁有Object的公共方法,意味著在java的面向對象的世界中,所有對象都擁有這些方法,非常通用。那么我們來看一看這些方法有哪些?

直接看一下,Object類的源碼:

package java.lang;

public class Object {

 

    private static native void registerNatives();

    static {

        registerNatives();

    }

 

    public final native Class<?> getClass();

 

    public native int hashCode();

 

    public boolean equals(Object obj) {

        return (this == obj);

    }

 

    protected native Object clone() throws CloneNotSupportedException;

 

    public String toString() {

        return getClass().getName() + "@" + Integer.toHexString(hashCode());

    }

 

    public final native void notify();

 

    public final native void notifyAll();

 

    public final native void wait(long timeout) throws InterruptedException;

 

    public final void wait(long timeout, int nanos) throws InterruptedException {

        if (timeout < 0) {

            throw new IllegalArgumentException("timeout value is negative");

        }

 

        if (nanos < 0 || nanos > 999999) {

            throw new IllegalArgumentException(

                                "nanosecond timeout value out of range");

        }

 

        if (nanos >= 500000 || (nanos != 0 && timeout == 0)) {

            timeout++;

        }

 

        wait(timeout);

    }

 

    public final void wait() throws InterruptedException {

        wait(0);

    }

 

    protected void finalize() throws Throwable { }

}

其實看JDK文檔大家都能知道這些方法的含義,不過我把自己對它們的理解介紹一下,這里面public的方法,重點我會詳細介紹較難掌握的wait和notify方法。

具體方法的說明如下:

public String toString()

這個默認是打印對象的getClass().getName() + '@' + Integer.toHexString(hashCode())

類名@哈希碼,可子類可重寫該方法定義自己的對象字符串,最常用。

public final native Class<?> getClass();

獲取對象的類名,在反射中可以用到。

public int hashCode();

public boolean equals(Object obj)

這兩個方法在集合框架的Set集合類中用途非常重要,因為Set集合中的元素不允許重復,各種自定義對象如何判斷是否重復,就是通過重寫這兩個方法來完成的。

public final native void notify();

public final native void notifyAll();

public final void wait()

public final native void wait(long timeout)

public final void wait(long timeout, int nanos)

這里幾組方法有多個重載方法,不過核心的方法就是wait方法和notify方法,這兩個方法,如果沒有學習過java多線程編程估計不會接觸到,這涉及到線程的同步以及在同步條件下線程通信的問題。

java 線程同步機制就是保證多個線程訪問同一個共享對象時不發生沖突的步驟是上鎖、操作、釋放鎖。而這個鎖是在java對象中隱含的鎖,鎖也叫"同步監視器" ,它是所有對象都擁有的,你不用可視而不見,

其實就定義在Object類中,不過我們不用了解它的存在,為了防止同一個共享對象不發生沖突,java用 synchronized 來保護共享對象不處于競爭狀態.,可采用同步方法或同步塊來完成,但是當同步環境下兩個線程需要通信怎么辦?如果沒有通信機制,兩個線程只能針對鎖的獲取發出輪詢效率很低,這里Object類的wait和notify兩個方法就可以解決這個問題。

采用 wait()/notify() 實現同步條件下線程間通信的原理如下:

使用前提:必須是同步條件,否則調用會異常.

調用wait()

調用線程會放棄CPU

調用線程釋放鎖

調用線程進入鎖的等待集合(池),等待CPU重新調度。

 

調用notify()

某個線程從鎖的等待集合中離開進入準備運行狀態

被通知的線程必須重新請求鎖才能執行.

notify()不能精確指定被通知的線程.

notifyAll() 通知所有在等待集合的線程離開進入準備運行狀態

 

下面以經典的生產者和消費者問題來了解生產者線程Producer和消費者線程Consumer,同步一個同享對象Shop,利用wait和notify方法來通信的代碼:

Puducer.java 生產者線程定義

public class Producer implements Runnable{

Shop shop;

 

public Producer(Shop shop) {

// TODO Auto-generated constructor stub

this.shop=shop;

new Thread(this,"生產者線程").start();

 

}

@Override

public void run() {

// TODO Auto-generated method stub

int i=0;

while(true){

shop.put(i++);

}

}

 

}

 

Consumer.java 消費者線程定義

public class Consumer implements Runnable{

Shop shop;

public Consumer(Shop shop) {

// TODO Auto-generated constructor stub

this.shop=shop;

new Thread(this,"消費者線程").start();

 

}

@Override

public void run() {

// TODO Auto-generated method stub

while(true){

shop.get();

}

 

}

 

}

共享對象Shop.java定義

public class Shop {

int no;

boolean hasData=false; //false表示無數據 true有數據

synchronized int get(){ //消費產品

if(hasData==false){

try {

wait();//消費者線程暫停

} catch (InterruptedException e) {

// TODO Auto-generated catch block

e.printStackTrace();

}

 

}

System.out.println("消費:"+no);

hasData=false;//消費完了.通知生產

notify();

return no;

}

 

synchronized void put(int no){ //放產品

if(hasData==true){

try {

wait();

} catch (InterruptedException e) {

// TODO Auto-generated catch block

e.printStackTrace();

}

}

System.out.println("生產:"+no);

hasData=true;

this.no=no;

notify();

}

 

}

測試類PC.java

public class PC {

 

public static void main(String[] args) {

Shop shop=new Shop();

new Producer(shop);

new Consumer(shop);

 

}

}

 

 

以上生產消費者問題很好的說明了wait和notify方法的用途,其他方法的變種例如wait(long timeout)就好理解了,如果超過指定時間等待的線程也會進入等待集合而不用再等待。

上一篇:字符串常量和字符串變量

下一篇:Static、extern關鍵字的用法

熱點文章推薦
華清學員就業榜單
高薪學員經驗分享
熱點新聞推薦
前臺專線:010-82525158 企業培訓洽談專線:010-82525379 院校合作洽談專線:010-82525379 Copyright © 2004-2022 北京華清遠見科技集團有限公司 版權所有 ,京ICP備16055225號-5京公海網安備11010802025203號

回到頂部

主站蜘蛛池模板: gogogo高清在线播放免费观看免费 | 自拍视频99 | 亚洲AV手机在线观看不卡 | 日本一区视频在线播放 | 国产精品兄妹在线观看麻豆 | 国产av午夜精品一区二区三 | 欧美日韩久久久久久 | 成人免费无码H在线观看 | 麻豆天美国产一区在线播放 | 黄色毛片播放 | 亚洲国产精品无码久久久不卡 | 狼人大香伊蕉国产www亚洲 | 日本免费极度色诱福利视频 | 好爽好紧好大的免费视频 | 天天躁夜夜躁狠狠喷水 | 成人天堂婷婷青青视频在线观看 | 三级理论日韩欧美 | 国外精品视频在线观看免费 | 国产欧美日韩一区二区三区在线 | 国产莉萝无码AV在线播放 | 嘿咻嘿咻成人免费视频播放 | 婷婷丁香五月中文字幕 | 中文亚洲成A人片在线观看 亚洲av日韩av成人av | 无码av中文一区二区三区 | 免费黄毛片 | 亚洲欧美人成无码苍井空 | 老司机深夜18禁污污网站 | 久久免费在线观看 | 免费精品国自产拍在线播放 | 亚洲欧洲成人A∨在线观看 亚洲AV一本岛在线播放 | 成人A级毛片免费观看AV | 国产精品毛片久久久久久久 | 秀婷程仪公欲息肉婷在线观看 | 国语少妇高潮对白在线 | 久久一及片 | 亚洲国产精品无码AV | 国产成人啪精品视频网站午夜 | 中国女人内谢25XXXXX | 久久久久AV无码免费网 | 亚洲欧美18岁网站 | 最近中文字幕高清2019中文字幕 |