一码秉、同步(Synchronous)和異步(Asynchronous)
? ? ? ? ? 同步和異步通常用來形容一次方法調(diào)用,同步方法,調(diào)用者必須等到方法調(diào)用返回后厘肮,才能繼續(xù)后續(xù)的行為,異步方法調(diào)用會立即返回睦番,調(diào)用者就可以繼續(xù)后續(xù)的操作类茂,
二耍属、并發(fā)和并行?
? ? ? ? 并發(fā)和并行都可以表示兩個或多個任務(wù)一起執(zhí)行,但偏重點(diǎn)點(diǎn)不同巩检,并發(fā)偏重于多個任務(wù)交替執(zhí)行厚骗,而多個任務(wù)之間有可能還是串行的。而并行是真正意義上的“同時執(zhí)行”兢哭。
三领舰、阻塞(Blocking)和非阻塞(Non-Blocking)
? ? ? ? 一個線程占用了臨界資源,那么其他所有需要這個資源的線程就必須在這個臨界區(qū)中進(jìn)行等待迟螺,等待會導(dǎo)致線程掛起冲秽,這種情況就是阻塞,非阻塞的意思與之相反矩父。
四锉桑、線程的狀態(tài)?
1、線程的啟動是調(diào)用start()方法窍株,而不是run()方法民轴。
2、線程的終止球订、不用stop()是因?yàn)閟top()方法太過暴力杉武,強(qiáng)行把執(zhí)行到一半的線程終止,可能會引起數(shù)據(jù)不一致的問題辙售,一般我們定義一個線程終止的方法轻抱,告知線程何時停止即可。
3旦部、線程中斷:線程中斷并不會使線程立即退出祈搜,而是給線程發(fā)一個通知,告知目標(biāo)線程士八,有人希望你退出容燕,至于目標(biāo)線程接到通知后如何處理,則完全由目標(biāo)線程自行決定婚度。與線程中斷的有三個方法
Thread.interrupt(): // 中斷線程
Thread.isInterrupted()://判斷是否中斷
Thread.Interrupted():// 判斷是否中斷蘸秘,并清除當(dāng)前中斷狀態(tài)
注:Thread.sleep()方法會拋出一個InterruptedException中斷異常,這不是運(yùn)行時異常蝗茁,也就是說程序必須捕獲并處理它醋虏。當(dāng)線程在休眠時,如果被中斷哮翘,這個異常會產(chǎn)生颈嚼。?
4、等待(wait)和通知(notify) 注:這兩個方法是在Object類中的饭寺,意味著任何對象都可以調(diào)用這兩個方法阻课。
obj.wait()方法叫挟,線程會停止繼續(xù)執(zhí)行,轉(zhuǎn)為等待狀態(tài)限煞,直到其他線程調(diào)用obj.notify()方法為止抹恳。調(diào)用object.wait()方法,就會進(jìn)入object對象的等待隊(duì)列署驻,當(dāng)調(diào)用object.notify()時奋献,會從這個等待隊(duì)列中,隨機(jī)選擇一個線程硕舆,并將其喚醒秽荞,這個選擇是不公平的,完全是隨機(jī)的抚官。notifyAll()會喚醒等待隊(duì)列里的所有線程扬跋,而不是隨機(jī)選擇一個線程。
5凌节、掛起(suspend)和繼續(xù)執(zhí)行(resume)線程
? ? suspend與resume是一組相反的操作钦听,調(diào)用suspend方法后的線程,必須等到resume方法調(diào)用后倍奢,才能繼續(xù)執(zhí)行朴上。
注:此方法已經(jīng)被廢棄,并不推薦使用卒煞,因?yàn)閟uspend()在導(dǎo)致線程暫停的同時痪宰,并不會去釋放任何資源。此? 時畔裕,若其他任何線程想要訪問被它暫用的鎖時衣撬,都會被牽連,導(dǎo)致無法正常繼續(xù)運(yùn)行扮饶。同時具练,若resume()方法在suspend()前就執(zhí)行了,那么被suspend()方法掛起的線程甜无,很難有機(jī)會被繼續(xù)執(zhí)行扛点,更為嚴(yán)重的是,它所占用的鎖不會被釋放岂丘,可能導(dǎo)致整個系統(tǒng)工作不正常陵究。同時,對于被掛起的線程元潘,從線程狀態(tài)上看畔乙,還是Runnable,會嚴(yán)重影響我們的判斷翩概。
6牲距、等待線程結(jié)束(join)和謙讓(yield)
? ?join有兩種情況:
Thread.join()?表示它會一直阻塞當(dāng)前線程,直到目標(biāo)線程執(zhí)行完畢钥庇。
Thread.join(millis)?給出了最大等待時間牍鞠,單位毫秒,如果超過給定時間目標(biāo)線程還在執(zhí)行评姨,當(dāng)前線程也會因?yàn)椤暗炔患啊蹦咽觯^續(xù)下執(zhí)行。
? Thread.yield()它會使當(dāng)前線程讓出CPU吐句,
注意:調(diào)用Thread.yield()方法后胁后,線程只是會讓CPU,但并不代表當(dāng)前線程不執(zhí)行嗦枢,當(dāng)前線程還是會參與CPU的爭奪攀芯。