Android多線程(三)——線程控制

前言:這里講的線程都不采用線程池,繼承Thread類和實(shí)現(xiàn)Runnable以及Callable都通過Thread來創(chuàng)建并啟動(dòng)劲妙,即這里的線程控制都是指Thread的方法

線程控制(即Thread類)主要有5個(gè)方法

  • join線程:join()
  • 后臺(tái)線程:setDaemon()
  • 線程睡眠:sleep()
  • 線程讓步:yield()
  • 改變線程優(yōu)先級(jí):setPriority()

一. join線程

join線程指:讓一個(gè)線程等待另一個(gè)線程完成敬飒。
1. join():等待線程執(zhí)行完成
當(dāng)在A線程中調(diào)用B線程的join()方法時(shí)达舒,調(diào)用線程(A線程)將被阻塞浪箭,直到B線程執(zhí)行完為止矗积。
2. join(long millis):等待被join的線程最長(zhǎng)時(shí)間為millis毫秒
在A線程里調(diào)用B線程的join(long millis)方法,A將被阻塞悬钳,阻塞時(shí)間不超過millis盐捷。假如B線程需要10*1000毫秒才執(zhí)行完畢,而millis為5000默勾,那么B執(zhí)行5秒后碉渡,A和B都回到就緒狀態(tài)
3. join(long millis,int nanos): 等待被join的線程最長(zhǎng)時(shí)間為millis毫秒+nanos毫微秒
該方法忽略不用

public class JoinCallable implements Callable {
    private int i=0;
    @Override
    public Object call() throws Exception {
        for (;i<5;i++){
            Log.d("MainActivity",Thread.currentThread().getName()+" i:"+i);
            Thread.sleep(100);
        }
        return null;
    }
}
//使用
    private void joinCallable() {
        
        try {
            for (int i=0;i<6;i++){
                Log.d("MainActivity",Thread.currentThread().getName()+":"+i);
                if (i==3){
                    Callable joinCallable = new JoinCallable();
                    FutureTask task = new FutureTask(joinCallable);
                    Thread thread = new Thread(task, "join線程");
                    thread.start();
                    thread.join();
                }
            }
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }
//運(yùn)行打印日志
2020-05-04 22:49:24.264 31878-31878/priv.hsj.thread D/MainActivity: main:0
2020-05-04 22:49:24.265 31878-31878/priv.hsj.thread D/MainActivity: main:1
2020-05-04 22:49:24.265 31878-31878/priv.hsj.thread D/MainActivity: main:2
2020-05-04 22:49:24.265 31878-31878/priv.hsj.thread D/MainActivity: main:3
2020-05-04 22:49:24.267 31878-31914/priv.hsj.thread D/MainActivity: join線程 i:0
2020-05-04 22:49:24.368 31878-31914/priv.hsj.thread D/MainActivity: join線程 i:1
2020-05-04 22:49:24.469 31878-31914/priv.hsj.thread D/MainActivity: join線程 i:2
2020-05-04 22:49:24.569 31878-31914/priv.hsj.thread D/MainActivity: join線程 i:3
2020-05-04 22:49:24.671 31878-31914/priv.hsj.thread D/MainActivity: join線程 i:4
2020-05-04 22:49:24.777 31878-31878/priv.hsj.thread D/MainActivity: main:4
2020-05-04 22:49:24.777 31878-31878/priv.hsj.thread D/MainActivity: main:5

注意:join方法必須要在start方法后調(diào)用才有效

二. 后臺(tái)線程

后臺(tái)線程是在后臺(tái)運(yùn)行的,為其他的線程提供服務(wù)母剥,他也叫”守護(hù)線程“和”精靈線程???♀?“滞诺。
JVM的垃圾回收線程就是典型的后臺(tái)線程。
如果所有的前臺(tái)線程都死亡环疼,后臺(tái)線程就會(huì)自動(dòng)死亡习霹。
Thread類還提供了isDaemon()方法,用于判斷指定線程是否為后臺(tái)線程炫隶。

注意:setDaemon(true)必須必須要在start()方法前調(diào)用淋叶,否則會(huì)IllegalThreadStateException異常。

三. 線程睡眠

線程睡眠是讓當(dāng)前正在執(zhí)行的線程暫停一段時(shí)間伪阶,即阻塞一段時(shí)間

  • sleep(long millis):讓當(dāng)前正在執(zhí)行的線程暫停millis毫秒煞檩,并進(jìn)入阻塞狀態(tài)
  • sleep(long millis,int nanos):讓當(dāng)前正在執(zhí)行的線程暫停millis毫秒加nanos毫微秒。該方法忽略不用栅贴。

當(dāng)前線程調(diào)用sleep()方法進(jìn)入阻塞狀態(tài)后斟湃,在其睡眠時(shí)間段內(nèi),該線程不會(huì)獲得執(zhí)行的機(jī)會(huì)檐薯,即使系統(tǒng)中沒有其他可執(zhí)行的線程凝赛,處于sleep()中的線程也不會(huì)執(zhí)行。
sleep()時(shí)間過完后,由阻塞狀態(tài)轉(zhuǎn)為就緒狀態(tài)

四. 線程讓步

線程讓步是將線程轉(zhuǎn)入就緒狀態(tài)

當(dāng)前線程調(diào)用yield()方法進(jìn)入就緒狀態(tài)哄酝,線程調(diào)度器重新調(diào)度
線程調(diào)用yield()方法后將執(zhí)行機(jī)會(huì)讓給優(yōu)先級(jí)相同友存,或優(yōu)先級(jí)更高的線程


sleep()與yield方法區(qū)別

  1. sleep()是將線程轉(zhuǎn)入阻塞狀態(tài)。yield()是將該線程轉(zhuǎn)入就緒狀態(tài)
  2. sleep()期間陶衅,會(huì)給其他線程執(zhí)行機(jī)會(huì)屡立,其他所有線程機(jī)會(huì)平等,與優(yōu)先級(jí)無關(guān)搀军。yield()只會(huì)給優(yōu)先級(jí)相同或優(yōu)先級(jí)更高的線程執(zhí)行機(jī)會(huì)膨俐,即有可能某個(gè)線程調(diào)用yield()方法暫停之后,會(huì)立即再次獲得CPU
  3. sleep()方法聲明拋出異常罩句,而yield()沒有聲明拋出異常焚刺。
  4. sleep()比yield()有更好的可移植性,并發(fā)線程一般不會(huì)使用yield()

五. 改變線程優(yōu)先級(jí)

每個(gè)線程執(zhí)行時(shí)都具有一定的優(yōu)先級(jí)门烂,優(yōu)先級(jí)高的線程獲得較多的執(zhí)行機(jī)會(huì)乳愉,優(yōu)先級(jí)低的獲得較少的執(zhí)行機(jī)會(huì)。
每個(gè)線程默認(rèn)的優(yōu)先級(jí)都與創(chuàng)建它的父線程的優(yōu)先級(jí)相同屯远。

setPriority(int newPriority)方法參數(shù)取值范圍為1~10蔓姚,默認(rèn)為5,Thread類給了三個(gè)靜態(tài)常量

  • MAX_PRIORITY:值為10
  • MIN_PRIORITY:值為1
  • NORM_PRIORITY:值為5
    在開發(fā)中慨丐,盡量避免使用具體數(shù)字坡脐,應(yīng)使用三個(gè)靜態(tài)常量,這樣更具有移植性房揭。

上一篇:Android多線程(二)——線程的生命周期:http://www.reibang.com/p/0b9468cda0c7

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末备闲,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子捅暴,更是在濱河造成了極大的恐慌恬砂,老刑警劉巖,帶你破解...
    沈念sama閱讀 222,807評(píng)論 6 518
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件伶唯,死亡現(xiàn)場(chǎng)離奇詭異觉既,居然都是意外死亡惧盹,警方通過查閱死者的電腦和手機(jī)乳幸,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 95,284評(píng)論 3 399
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來钧椰,“玉大人粹断,你說我怎么就攤上這事〉障迹” “怎么了瓶埋?”我有些...
    開封第一講書人閱讀 169,589評(píng)論 0 363
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)。 經(jīng)常有香客問我养筒,道長(zhǎng)曾撤,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 60,188評(píng)論 1 300
  • 正文 為了忘掉前任晕粪,我火速辦了婚禮挤悉,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘巫湘。我一直安慰自己装悲,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 69,185評(píng)論 6 398
  • 文/花漫 我一把揭開白布尚氛。 她就那樣靜靜地躺著诀诊,像睡著了一般。 火紅的嫁衣襯著肌膚如雪阅嘶。 梳的紋絲不亂的頭發(fā)上属瓣,一...
    開封第一講書人閱讀 52,785評(píng)論 1 314
  • 那天,我揣著相機(jī)與錄音讯柔,去河邊找鬼奠涌。 笑死,一個(gè)胖子當(dāng)著我的面吹牛磷杏,可吹牛的內(nèi)容都是我干的溜畅。 我是一名探鬼主播,決...
    沈念sama閱讀 41,220評(píng)論 3 423
  • 文/蒼蘭香墨 我猛地睜開眼极祸,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼慈格!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起遥金,我...
    開封第一講書人閱讀 40,167評(píng)論 0 277
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤浴捆,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后稿械,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體选泻,經(jīng)...
    沈念sama閱讀 46,698評(píng)論 1 320
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,767評(píng)論 3 343
  • 正文 我和宋清朗相戀三年美莫,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了页眯。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 40,912評(píng)論 1 353
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡厢呵,死狀恐怖窝撵,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情襟铭,我是刑警寧澤碌奉,帶...
    沈念sama閱讀 36,572評(píng)論 5 351
  • 正文 年R本政府宣布短曾,位于F島的核電站,受9級(jí)特大地震影響赐劣,放射性物質(zhì)發(fā)生泄漏嫉拐。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 42,254評(píng)論 3 336
  • 文/蒙蒙 一魁兼、第九天 我趴在偏房一處隱蔽的房頂上張望椭岩。 院中可真熱鬧,春花似錦璃赡、人聲如沸判哥。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,746評(píng)論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)塌计。三九已至,卻和暖如春侯谁,著一層夾襖步出監(jiān)牢的瞬間锌仅,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,859評(píng)論 1 274
  • 我被黑心中介騙來泰國(guó)打工墙贱, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留热芹,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 49,359評(píng)論 3 379
  • 正文 我出身青樓惨撇,卻偏偏與公主長(zhǎng)得像伊脓,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子魁衙,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,922評(píng)論 2 361