Thread線程一覽

創(chuàng)建線程的三種方式:

  • 繼承Thread類
語法:public class A extends Thread{}
案例:A a=new A();a.start();
  • 實(shí)現(xiàn)Runnable接口
語法:public class A implements Runnable{}
案例:A a=new A();Thread t=new Thread(a);t.start()
  • 實(shí)現(xiàn)了Callable接口(有返回值的線程)
語法:public class CallableDemo implements Callable<Integer>
案例:
ExecutorService es = Executors.newSingleThreadExecutor(); //創(chuàng)建線程池
CallableDemo calTask=new CallableDemo();//創(chuàng)建Callable對象任務(wù)
Future<Integer> future =es.submit(calTask);//提交任務(wù)并獲取執(zhí)行結(jié)果
future.get()//輸出返回來的值

線程安全之“鎖”:

01-synchronized

synchronized保證代碼具有原子性和可見性递胧,可見性保證每次讀取到的是最新值,原子性保證在整個(gè)操作過程中確保代碼執(zhí)行的原子性,不可分割逃沿。

image.png

02-ReentrantLock

ReentrantLock是一個(gè)可重入的互斥鎖懂算,又被稱為“獨(dú)占鎖”距贷。顧名思義轩端,ReentrantLock鎖在同一個(gè)時(shí)間點(diǎn)只能被一個(gè)線程鎖持有党涕;而可重入的意思是活烙,ReentrantLock鎖,可以被單個(gè)線程多次獲取遣鼓。

“公平鎖”和“非公平鎖”:ReentrantLock分為“公平鎖”和“非公平鎖”啸盏。它們的區(qū)別體現(xiàn)在獲取鎖的機(jī)制上是否公平∑锼睿“鎖”是為了保護(hù)競爭資源回懦,防止多個(gè)線程同時(shí)操作線程而出錯(cuò),ReentrantLock在同一個(gè)時(shí)間點(diǎn)只能被一個(gè)線程獲取(當(dāng)某線程獲取到“鎖”時(shí)次企,其它線程就必須等待)怯晕;ReentraantLock是通過一個(gè)FIFO的等待隊(duì)列來管理獲取該鎖所有線程的。在“公平鎖”的機(jī)制下缸棵,線程依次排隊(duì)獲取鎖舟茶;而“非公平鎖”在鎖是可獲取狀態(tài)時(shí),不管自己是不是在隊(duì)列的開頭都會獲取鎖堵第。

使用方式:

創(chuàng)建鎖對象:Lock lock = new ReentrantLock();
鎖代碼:lock.lock();.......鎖的內(nèi)容贿堰;.......lock.unlock();

常用方法:

(1)嘗試獲取鎖:boolean locked = lock.tryLock();//根據(jù)locked值去判定執(zhí)行什么樣的代碼
(2)嘗試超時(shí):boolean locked=lock.tryLock(5, TimeUnit.SECONDS);//嘗試獲取lock鎖對象5秒
(3)可打斷:lock.lockInterruptibly(),線程在請求lock并被阻塞時(shí)(t1占用了lock鎖對象赞咙,t2請求被阻塞)颊亮,如果此時(shí)t2被t3線程interrupt(t2.interrupt())宿饱,則“此t2線程會被喚醒并被要求處理InterruptedException”。
通俗理解:
(1)lock(), 拿不到lock就不罷休针余,不然線程就一直block饲鄙。 比較無賴的做法。不能被打斷
(2)tryLock()圆雁,馬上返回忍级,拿到lock就返回true,不然返回false伪朽。 比較瀟灑的做法轴咱。
帶時(shí)間限制的tryLock(),拿不到lock,就等一段時(shí)間嗦玖,超時(shí)返回false患雇。比較聰明的做法跃脊。
(3)lock.lockInterruptibly()請求鎖宇挫,請求不到也會一直請求,但是可以被其他線程打斷酪术,打斷后處理InterruptedException異常器瘪,即執(zhí)行catch和finally代碼塊
03-synchronized和ReentrantLock的區(qū)別
(1)synchronized的鎖是自動(dòng)釋放的,而ReentrantLock得lock需要手動(dòng)釋放(lock.unlock())绘雁;
(2)使用synchronized鎖定的話如果遇到異常橡疼,jvm會自動(dòng)釋放鎖,但是lock必須手動(dòng)釋放鎖庐舟,因此經(jīng)常在finally中進(jìn)行鎖的釋放欣除;
(3)ReentrantLock更具靈活性

常見線程池:

線程池是一種多線程處理形式,處理過程中將任務(wù)添加到隊(duì)列挪略,然后在創(chuàng)建線程后自動(dòng)啟動(dòng)這些任務(wù)历帚。線程池線程都是后臺線程。

01-newFixedThreadPool(6)

案例:ExecutorService service = Executors.newFixedThreadPool(6);
解讀:來一個(gè)任務(wù)杠娱,創(chuàng)建一個(gè)線程挽牢,線程啟動(dòng)后不會銷毀,上限是6個(gè)摊求。當(dāng)線程被占用完時(shí)禽拔,所有任務(wù)都被放在一個(gè)隊(duì)列中進(jìn)行等待,等待線程被釋放室叉。

02-newCachedThreadPool()

案例:ExecutorService service = Executors.newCachedThreadPool();
解讀:剛開始一個(gè)線程都沒有睹栖,來一個(gè)任務(wù)就起一個(gè)線程,當(dāng)來新任務(wù)時(shí)發(fā)現(xiàn)有空閑的線程茧痕,就直接使用空閑的磨淌,不再新起線程了(線程空閑1min就自動(dòng)銷毀);當(dāng)來新任務(wù)時(shí)發(fā)現(xiàn)沒有空閑的線程凿渊,此時(shí)便啟動(dòng)一個(gè)新的線程梁只,保證在等待區(qū)任務(wù)隊(duì)列中的任務(wù)個(gè)數(shù)永遠(yuǎn)為0;

03-newSingleThreadExecutor()

案例:ExecutorService service = Executors.newSingleThreadExecutor();
解讀:線程池永遠(yuǎn)只有一個(gè)線程埃脏。保證任務(wù)的先后執(zhí)行順序搪锣,只有第一個(gè)任務(wù)執(zhí)行完,才能執(zhí)行第二個(gè)任務(wù)彩掐。線程起來后永遠(yuǎn)不結(jié)束构舟。

04-newScheduledThreadPool(4);

案例:ScheduledExecutorService service = Executors.newScheduledThreadPool(4);
解讀:執(zhí)行定時(shí)的任務(wù)。線程是可以復(fù)用的堵幽,第一個(gè)線程來了狗超,執(zhí)行完后弹澎,來第二個(gè)線程,這時(shí)候就直接用已存在的空閑線程努咐。定時(shí)容器裝任務(wù)苦蒿,線程啟動(dòng)后就不會銷毀。service.scheduleAtFixedRate(task, 0, 500, TimeUnit.MILLISECONDS);第一個(gè)tast立即執(zhí)行渗稍,沒隔500mms執(zhí)行一次任務(wù)佩迟。

05-newWorkStealingPool();

案例:ExecutorService service = Executors.newWorkStealingPool();
解讀:工作竊取,每個(gè)線程維護(hù)自己的等待隊(duì)列竿屹,當(dāng)自己隊(duì)列為空時(shí)报强,會去偷其他線程隊(duì)列中的任務(wù)。

06-new ForkJoinPool()

作用:將一個(gè)任務(wù)進(jìn)行拆分處理拱燃,并將處理后的結(jié)果進(jìn)行匯總
案例:
ForkJoinPool fjp = new ForkJoinPool();

執(zhí)行分塊的類秉溉,需要extends RecursiveTask或RecursiveAction,其中:AddTask extends RecursiveAction:無返回值碗誉;AddTask extends RecursiveTask :有返回值召嘶,通過task.join()加入主線程匯總求和。

分塊:AddTask task = new AddTask(0, nums.length);
執(zhí)行分塊計(jì)算:fjp.execute(task);
解讀:工作竊取诗充,每個(gè)線程維護(hù)自己的等待隊(duì)列苍蔬,當(dāng)自己隊(duì)列為空時(shí),會去偷其他線程隊(duì)列中的任務(wù)蝴蜓。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末碟绑,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子茎匠,更是在濱河造成了極大的恐慌格仲,老刑警劉巖,帶你破解...
    沈念sama閱讀 219,039評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件诵冒,死亡現(xiàn)場離奇詭異凯肋,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)汽馋,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,426評論 3 395
  • 文/潘曉璐 我一進(jìn)店門侮东,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人豹芯,你說我怎么就攤上這事悄雅。” “怎么了铁蹈?”我有些...
    開封第一講書人閱讀 165,417評論 0 356
  • 文/不壞的土叔 我叫張陵宽闲,是天一觀的道長。 經(jīng)常有香客問我,道長容诬,這世上最難降的妖魔是什么娩梨? 我笑而不...
    開封第一講書人閱讀 58,868評論 1 295
  • 正文 為了忘掉前任,我火速辦了婚禮览徒,結(jié)果婚禮上狈定,老公的妹妹穿的比我還像新娘。我一直安慰自己吱殉,他們只是感情好掸冤,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,892評論 6 392
  • 文/花漫 我一把揭開白布厘托。 她就那樣靜靜地躺著友雳,像睡著了一般。 火紅的嫁衣襯著肌膚如雪铅匹。 梳的紋絲不亂的頭發(fā)上押赊,一...
    開封第一講書人閱讀 51,692評論 1 305
  • 那天,我揣著相機(jī)與錄音包斑,去河邊找鬼流礁。 笑死,一個(gè)胖子當(dāng)著我的面吹牛罗丰,可吹牛的內(nèi)容都是我干的神帅。 我是一名探鬼主播,決...
    沈念sama閱讀 40,416評論 3 419
  • 文/蒼蘭香墨 我猛地睜開眼萌抵,長吁一口氣:“原來是場噩夢啊……” “哼找御!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起绍填,我...
    開封第一講書人閱讀 39,326評論 0 276
  • 序言:老撾萬榮一對情侶失蹤霎桅,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后讨永,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體滔驶,經(jīng)...
    沈念sama閱讀 45,782評論 1 316
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,957評論 3 337
  • 正文 我和宋清朗相戀三年卿闹,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了揭糕。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 40,102評論 1 350
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡锻霎,死狀恐怖著角,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情量窘,我是刑警寧澤雇寇,帶...
    沈念sama閱讀 35,790評論 5 346
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響锨侯,放射性物質(zhì)發(fā)生泄漏嫩海。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,442評論 3 331
  • 文/蒙蒙 一囚痴、第九天 我趴在偏房一處隱蔽的房頂上張望叁怪。 院中可真熱鬧,春花似錦深滚、人聲如沸奕谭。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,996評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽血柳。三九已至,卻和暖如春生兆,著一層夾襖步出監(jiān)牢的瞬間难捌,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,113評論 1 272
  • 我被黑心中介騙來泰國打工鸦难, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留根吁,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 48,332評論 3 373
  • 正文 我出身青樓合蔽,卻偏偏與公主長得像击敌,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個(gè)殘疾皇子拴事,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,044評論 2 355

推薦閱讀更多精彩內(nèi)容