溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

怎么創(chuàng)建Java線程對(duì)象

發(fā)布時(shí)間:2021-12-22 15:52:17 來源:億速云 閱讀:174 作者:iii 欄目:編程語言

本篇內(nèi)容介紹了“怎么創(chuàng)建Java線程對(duì)象”的有關(guān)知識(shí),在實(shí)際案例的操作過程中,不少人都會(huì)遇到這樣的困境,接下來就讓小編帶領(lǐng)大家學(xué)習(xí)一下如何處理這些情況吧!希望大家仔細(xì)閱讀,能夠?qū)W有所成!

默認(rèn)情況下,主線程和垃圾回收線程都是由系統(tǒng)創(chuàng)建的,但是我們需要完成自己的功能----創(chuàng)建自己的線程對(duì)象

 java將線程面向?qū)ο罅?形成的類就是Thread,在Thread類內(nèi)部執(zhí)行任務(wù)的方法叫run()

 注意:如果想讓run作為任務(wù)區(qū),必須讓他去被自動(dòng)調(diào)用.我們通過執(zhí)行start()方法,來開啟線程,繼而實(shí)現(xiàn)run方法的自動(dòng)調(diào)用.

主線程的名字:main   子線程的名字:從Thread-0開始命名

//創(chuàng)建自己的線程對(duì)象

//分析:由于我們實(shí)現(xiàn)的實(shí)際功能Thread類是決定不了的,所以沒有辦法將我們的功能放入Thread的run方法里,如果我們想實(shí)現(xiàn)自己的功能,可以寫Thread類的子類,重寫run方法,實(shí)現(xiàn)我們的功能.run就是我們的任務(wù)區(qū)

實(shí)現(xiàn)多線程的方式兩種:

 第一種方式:通過創(chuàng)建Thread子類的方式實(shí)現(xiàn)功能----線程與任務(wù)綁定在了一起,操作不方便

 第二種:將任務(wù)從線程中分離出來,哪個(gè)線程需要工作,就將任務(wù)交給誰,操作方便

當(dāng)線程與任務(wù)分離后

這里Thread內(nèi)部默認(rèn)有一個(gè)run,又通過ticket傳入一個(gè)run,為什么優(yōu)先調(diào)用的是傳入的run

如果該線程是使用獨(dú)立的 Runnable 運(yùn)行對(duì)象構(gòu)造的,則調(diào)用該 Runnable 對(duì)象的 run 方法;否則,該方法不執(zhí)行任何操作并返回。

2.線程安全

1、synchronized關(guān)鍵字:

1、synchronized關(guān)鍵字的作用域有二種:

1)是某個(gè)對(duì)象實(shí)例內(nèi),synchronized aMethod(){}可以防止多個(gè)線程同時(shí)訪問這個(gè)對(duì)象的synchronized方法(如果一個(gè)對(duì)象有多個(gè)synchronized方法,只要一個(gè)線程訪問了其中的一個(gè)synchronized方法,其它線程不能同時(shí)訪問這個(gè)對(duì)象中任何一個(gè)synchronized方法)。這時(shí),不同的對(duì)象實(shí)例的synchronized方法是不相干擾的。也就是說,其它線程照樣可以同時(shí)訪問相同類的另一個(gè)對(duì)象實(shí)例中的synchronized方法;

2)是某個(gè)類的范圍,synchronized static aStaticMethod{}防止多個(gè)線程同時(shí)訪問這個(gè)類中的synchronized static 方法。它可以對(duì)類的所有對(duì)象實(shí)例起作用。

2、除了方法前用synchronized關(guān)鍵字,synchronized關(guān)鍵字還可以用于方法中的某個(gè)區(qū)塊中,表示只對(duì)這個(gè)區(qū)塊的資源實(shí)行互斥訪問。用法是: synchronized(this){/區(qū)塊/},它的作用域是當(dāng)前對(duì)象;

3、synchronized關(guān)鍵字是不能繼承的,也就是說,基類的方法synchronized f(){} 在繼承類中并不自動(dòng)是synchronized f(){},而是變成了f(){}。繼承類需要你顯式的指定它的某個(gè)方法為synchronized方法;

實(shí)現(xiàn)線程安全的方式:

1.在代碼中使用同步代碼塊兒(同步鎖)

解釋:在某一段任務(wù)中,同一時(shí)間只允許一個(gè)線程執(zhí)行任務(wù),其他的線程即使搶到了cpu,也無法進(jìn)入當(dāng)前的任務(wù)區(qū)間,只有當(dāng)當(dāng)前的線程將任務(wù)執(zhí)行完后,其他的線程才能有資格進(jìn)入

同步代碼塊兒的構(gòu)成:

synchronized(鎖(對(duì)象)){

  同步的代碼

 }

對(duì)作為鎖的對(duì)象的要求:

1.必須是對(duì)象      

2.必須保證被多個(gè)線程共享

可以充當(dāng)鎖的:

1.一個(gè)普通的對(duì)象      

2.當(dāng)前對(duì)象的引用--this    

3.類的字節(jié)碼文件 --注意:字節(jié)碼文件的使用范圍太大,一般不建議使用.

同步代碼塊兒的特點(diǎn):

1.可以保證線程的安全    

2.由于每次都要進(jìn)行判斷處理,所以降低了執(zhí)行效率

總結(jié):什么時(shí)候使用同步代碼塊兒

1.多個(gè)線程共享一個(gè)數(shù)據(jù)

2.至少有兩個(gè)線程

比較同步代碼塊兒和同步函數(shù)

同步代碼塊兒使用更加的靈活,只給需要同步的部分代碼同步即可,而同步函數(shù)是給這個(gè)函數(shù)內(nèi)的所有代碼同步.

由于處于同步的代碼越少越好,所以最好使用同步代碼塊兒

注意:1.當(dāng)在一個(gè)類中同時(shí)存在多個(gè)synchronized修飾的代碼塊兒或函數(shù)時(shí),要想安全,就必須讓他們后面的對(duì)象一致。因?yàn)橹挥型话焰i才能安全。

同步函數(shù)的鎖:this

2靜態(tài)同步函數(shù)在進(jìn)內(nèi)存的時(shí)候不會(huì)創(chuàng)建對(duì)象,但是存在其所屬類的字節(jié)碼文件對(duì)象,屬于class類型的對(duì)象,

所以靜態(tài)同步函數(shù)的鎖是其所屬類的字節(jié)碼文件對(duì)象

示例:

    //使用同步代碼塊兒

    public void addMoney(int money) {

        synchronized (Bank.class) {

            this.money += money;

            System.out.println(this.money);

        }

    }

    //使用同步函數(shù)

    //非靜態(tài)的同步函數(shù)

    //在synchronized后面默認(rèn)有一個(gè)this

    public synchronized void addMoney(int money) {

        this.money += money;

        System.out.println(this.money);

    }

 wait():讓當(dāng)前的線程變成等待的狀態(tài),放入一個(gè)池子(線程容器),失去了搶cpu的能力,.等待喚醒(鎖相當(dāng)于給當(dāng)前的線程做了一個(gè)標(biāo)記)

notify():讓當(dāng)前的線程從等待狀態(tài)喚醒,相當(dāng)于從池子中取出線程.(喚醒的是同一把鎖下的任意一個(gè)線程)

notifyAll():喚醒的是同一把鎖下的所有線程

死鎖:出現(xiàn)的情況有兩種

 1.所有的線程處于等待狀態(tài)

 2.鎖之間進(jìn)行嵌套調(diào)用

2.Lock

比較synchronized和Lock

 1.synchronized:從jdk1.0就開始使用的同步方法-稱為隱式同步

 synchronized(鎖對(duì)象){//獲取鎖      我們將鎖還可以稱為鎖旗艦或者監(jiān)聽器

 同步的代碼

 }//釋放鎖

 2.Lock:從jdk1.5開始使用的同步方法-稱為顯示同步

 原理:Lock本身是接口,要通過他的子類創(chuàng)建對(duì)象干活兒

 使用過程:

 首先調(diào)用lock()方法獲取鎖

 進(jìn)行同步的代碼塊兒

 使用unlock()方法釋放鎖

 使用的場(chǎng)景:

 當(dāng)進(jìn)行多生產(chǎn)者多消費(fèi)者的功能時(shí),使用Lock,其他的都使用synchronized

 使用效率上:Lock高于synchronized

線程的停止: 3種

 1.通過一個(gè)標(biāo)識(shí)結(jié)束線程

 2.調(diào)用stop方法---因?yàn)橛泄逃械陌踩珕栴},所以系統(tǒng)不建議使用.

 3.調(diào)用interrupt方法----如果目標(biāo)線程等待很長時(shí)間(例如基于一個(gè)條件變量),則應(yīng)使用 interrupt 方法來中斷該等待。

守護(hù)線程:

相當(dāng)于后臺(tái)線程.依賴于前臺(tái)線程.正常情況下,當(dāng)前臺(tái)線程結(jié)束的時(shí)候,不管守護(hù)線程有沒有結(jié)束,都會(huì)立刻結(jié)束.

 典型的守護(hù)線程:垃圾回收線程

 當(dāng)程序調(diào)用setDaemon方法時(shí),并且將參數(shù)設(shè)置成true.當(dāng)前線程就變成了守護(hù)線層.

 注意:這個(gè)方法一定要在start方法之前調(diào)用

 thread0.setDaemon(true);

 thread0.start();

join()方法:

 原理:線程一旦調(diào)用了join方法,他的優(yōu)先級(jí)會(huì)高于主線程.主線程會(huì)等當(dāng)前的線程執(zhí)行完后再去執(zhí)行.

 注意點(diǎn):優(yōu)先級(jí)只比main線程的高.對(duì)其他的線程沒有影響.

 當(dāng)線程開始工作后,讓t0調(diào)用join方法,讓他的優(yōu)先級(jí)高于main線程

 注意:join方法必須在線程開始工作后,執(zhí)行.

     t0.start();
      try {
          t0.join();
      } catch (InterruptedException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }

wait():使一個(gè)線程處于等待狀態(tài),并且釋放所持有的對(duì)象的lock。

sleep():使一個(gè)正在運(yùn)行的線程處于睡眠狀態(tài),是一個(gè)靜態(tài)方法,調(diào)用此方法要捕捉InterruptedException異常。

notify():喚醒一個(gè)處于等待狀態(tài)的線程,注意的是在調(diào)用此方法的時(shí)候,并不能確切的喚醒某一個(gè)等待狀態(tài)的線程,而是由JVM確定喚醒哪個(gè)線程,而且不是按優(yōu)先級(jí)。

notityAll():喚醒所有處入等待狀態(tài)的線程,注意并不是給所有喚醒線程一個(gè)對(duì)象的鎖,而是讓它們競(jìng)爭。

“怎么創(chuàng)建Java線程對(duì)象”的內(nèi)容就介紹到這里了,感謝大家的閱讀。如果想了解更多行業(yè)相關(guān)的知識(shí)可以關(guān)注億速云網(wǎng)站,小編將為大家輸出更多高質(zhì)量的實(shí)用文章!

向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI