第二章 Java并行程序基礎

1. 進程和線程

  • 進程是系統(tǒng)進行資源分配的基本單位。早期年柠,進程是程序的基本執(zhí)行實體凿歼,當代計算機結構中,進程是線程的容器冗恨。
  • 線程是輕量級的進程答憔,是程序執(zhí)行的最小單位。使用多線程而不是多進程是因為線程的切換和調度的成本遠遠小于進程掀抹。


    線程生命周期
  1. NEW : 剛剛創(chuàng)建的線程攀唯,還沒開始執(zhí)行,等到start()方法調用渴丸,獲得相關資源后進入RUNNABLE狀態(tài)。
  2. RUNNABLE:線程執(zhí)行狀態(tài)。
  3. BLOCKED:線程執(zhí)行時遇到sychronized同步塊谱轨,進入BLOCKED狀態(tài)戒幔。線程暫停執(zhí)行,直到獲取請求的鎖土童,進入RUNNABLE诗茎。
  4. WAITING和TIMED_WAITING:等待狀態(tài),等待一些事件献汗。如:wait()方法等待的線程在等待notify()方法敢订,join()方法等待的線程在等待目標線程停止。等到期望事件后進入RUNNABLE狀態(tài)罢吃。
  5. TERMINATED:線程執(zhí)行完畢楚午。

2. 初始線程:線程的基本操作

2.1 新建線程

  1. 繼承Thread類,重寫run方法(Java單繼承尿招,不建議使用)
  2. 實現(xiàn)Runnable接口矾柜,實現(xiàn)run方法,將實現(xiàn)類對象傳入Thread構造函數(shù)就谜。
class Thread1 implements Runnable{
    @Override
    public void run() {
        System.out.println("i am a thread");
    }
}

Thread thread2 = new Thread(new Thread1());
thread.start();

2.2 終止線程

  • Thread提供了一個stop()方法怪蔑,但是不建議使用,這個方法會直接終止線程丧荐,釋放這個線程所持有的所有鎖缆瓣。會破壞數(shù)據(jù)一致性。例如寫線程正在寫數(shù)據(jù)虹统,直接stop弓坞,讀線程獲取鎖,此時讀出的數(shù)據(jù)是不對的窟却。
  • 要想終止線程昼丑,可以設置一個flag標志,需要終止時夸赫,調用方法菩帝,改變flag的值。

2.3 中斷線程

  • 中斷線程不會使線程立即退出茬腿,而是給線程發(fā)送一個通知呼奢,告知目標線程,至于目標線程如何處理切平,完全由目標線程自行決定握础。
void interrupt():中斷線程
boolean isInterrupted():判斷是否被中斷
static boolean interrupted():判斷是否被中斷,并且清除中斷標志
Thread t1 = new Thread() {
    public void run() {
        while(true) {
            if(Thread.currentThread().isInterrupted()) {
                System.out.println("準備退出");
                break;
            }
            try {
                Thread.sleep(2000);
            }catch (InterruptedException e) {
                Thread.currentThread().interrupt();
            }
             Thread.yield();
        }
    }
};
        
t1.start();
Thread.sleep(2000);
t1.interrupt();
  • 中斷sleep()的線程會拋出InterruptedException異常悴品,并且清除中斷標志禀综,如果不處理简烘,下次循環(huán)不會檢測到已中斷,所以在異常處理中再次中斷自己定枷。

2.4 等待(wait)和通知(notify)

  • 兩個方法屬于Object類
  • 一個對象obj調用wait()方法后孤澎,當前線程就會停止執(zhí)行,進入obj的等待隊列欠窒,直到obj調用notify或者notifyAll方法覆旭。調用notify時,隨機從obj的等待隊列中選擇一個線程喚醒岖妄。
  • 調用wait和notify之前型将,都需要獲取此對象obj的鎖。
  • wait()方法會釋放所有的鎖荐虐,sleep()方法不會釋放七兜。
等待隊列
wait和notify工作流程

2.5 掛起(suspend)和繼續(xù)執(zhí)行(resume)

  • 已廢棄
  • 被suspend的線程只有等到resume后才能繼續(xù)執(zhí)行。
  • suspend在暫停線程的同時缚俏,不會釋放任何資源惊搏。
  • 被suspend的線程狀態(tài)還是RUNNABLE。

2.6 等待線程結束(join)和謙讓(yield)

  • join:當前線程阻塞忧换,直到目標線程執(zhí)行完畢恬惯。
  • yield:當前線程讓出CPU,重新等待調度亚茬。

3. 分門別類的管理:線程組

  • 給線程分組
ThreadGroup tg = new ThreadGroup("A組");
Thread t1 = new Thread(tg,new Thread(),"線程1");
Thread t2 = new Thread(tg,new Thread(),"線程2");
        
System.out.println(tg.activeCount());
tg.list();

4 守護線程(Daemon)

  • 作為系統(tǒng)后臺服務酪耳。
  • 其他非守護線程結束后,守護線程自動結束刹缝。
    -setDaemon()必須在start()之前設置碗暗。
Thread t1 = new Thread();
t1.setDaemon(true);

5. 線程優(yōu)先級

  • 優(yōu)先級高的線程在競爭資源時會更有優(yōu)勢,但只是概率問題梢夯。
  • 優(yōu)先級與底層操作系統(tǒng)密切聯(lián)系言疗,各個平臺表現(xiàn)不一。
//Java中用1-10表示颂砸,值越大優(yōu)先級越高
public final static int MIN_PRIORITY = 1;
public final static int NORM_PRIORITY = 5;
public final static int MAX_PRIORITY = 10;

6. 線程安全與synchronized

  • volatile一定程度上改善了線程安全的問題噪奄,但是只能保證一個線程修改了數(shù)據(jù)后,其他線程能夠看到這個改動人乓。當兩個線程同時修改這個數(shù)據(jù)時勤篮,依然會產生沖突。
  • sychronized可以實現(xiàn)線程的同步色罚,通過對代碼加鎖碰缔,使得每一次只能有一個線程進入同步塊。
  • 編碼時要確保是同一個鎖戳护。
  • 三種加鎖方式
  1. 指定加鎖對象金抡。
  2. 作用于實例方法:相當于對當前實例加鎖瀑焦。
  3. 作用于靜態(tài)方法:相當于對當前類加鎖。

7. 詭異的錯誤

  • 并發(fā)下普通的集合是不安全的梗肝。
  • 錯誤的加鎖方式
//Integer是不可變的對象蝠猬,一旦創(chuàng)建就不能修改,實際上每次i++都新建了Integer對象重新賦值统捶,所以每次的鎖不是同一個。
Integer i = 0;
sychronized(i){
  i++;
}

?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
  • 序言:七十年代末柄粹,一起剝皮案震驚了整個濱河市喘鸟,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌驻右,老刑警劉巖什黑,帶你破解...
    沈念sama閱讀 218,284評論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異堪夭,居然都是意外死亡愕把,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,115評論 3 395
  • 文/潘曉璐 我一進店門森爽,熙熙樓的掌柜王于貴愁眉苦臉地迎上來恨豁,“玉大人,你說我怎么就攤上這事爬迟¢倜郏” “怎么了?”我有些...
    開封第一講書人閱讀 164,614評論 0 354
  • 文/不壞的土叔 我叫張陵付呕,是天一觀的道長计福。 經常有香客問我,道長徽职,這世上最難降的妖魔是什么象颖? 我笑而不...
    開封第一講書人閱讀 58,671評論 1 293
  • 正文 為了忘掉前任,我火速辦了婚禮姆钉,結果婚禮上说订,老公的妹妹穿的比我還像新娘。我一直安慰自己育韩,他們只是感情好克蚂,可當我...
    茶點故事閱讀 67,699評論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著筋讨,像睡著了一般埃叭。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上悉罕,一...
    開封第一講書人閱讀 51,562評論 1 305
  • 那天赤屋,我揣著相機與錄音立镶,去河邊找鬼。 笑死类早,一個胖子當著我的面吹牛媚媒,可吹牛的內容都是我干的。 我是一名探鬼主播涩僻,決...
    沈念sama閱讀 40,309評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼缭召,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了逆日?” 一聲冷哼從身側響起嵌巷,我...
    開封第一講書人閱讀 39,223評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎室抽,沒想到半個月后搪哪,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經...
    沈念sama閱讀 45,668評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡坪圾,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 37,859評論 3 336
  • 正文 我和宋清朗相戀三年晓折,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片兽泄。...
    茶點故事閱讀 39,981評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡漓概,死狀恐怖,靈堂內的尸體忽然破棺而出已日,到底是詐尸還是另有隱情垛耳,我是刑警寧澤,帶...
    沈念sama閱讀 35,705評論 5 347
  • 正文 年R本政府宣布飘千,位于F島的核電站堂鲜,受9級特大地震影響,放射性物質發(fā)生泄漏护奈。R本人自食惡果不足惜缔莲,卻給世界環(huán)境...
    茶點故事閱讀 41,310評論 3 330
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望霉旗。 院中可真熱鬧痴奏,春花似錦、人聲如沸厌秒。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,904評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽鸵闪。三九已至檐晕,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背辟灰。 一陣腳步聲響...
    開封第一講書人閱讀 33,023評論 1 270
  • 我被黑心中介騙來泰國打工个榕, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人芥喇。 一個月前我還...
    沈念sama閱讀 48,146評論 3 370
  • 正文 我出身青樓西采,卻偏偏與公主長得像,于是被迫代替她去往敵國和親继控。 傳聞我的和親對象是個殘疾皇子械馆,可洞房花燭夜當晚...
    茶點故事閱讀 44,933評論 2 355

推薦閱讀更多精彩內容

  • 1、從開始寫作的那一刻開始武通,我已經意識到狱杰,我不夠隨意,但是又不甘于接受生活的安排厅须,我可以整天圍著我喜歡的人喜歡的東...
    一夕Joy閱讀 257評論 0 0
  • 會發(fā)現(xiàn)自己很容易對自己寫的文章產生一種驕傲的感覺,想讓很多人看到食棕,獲得別人的贊同朗和,就像我現(xiàn)在發(fā)到朋友圈的文章,我很...
    妖臨寺閱讀 409評論 5 10
  • 我活成了什么模樣 是勇往直前的膽量簿晓,還是勇敢的退縮眶拉? 活成的模樣,還是孩童時的向往憔儿?…… 強調享受過程忆植,感受一切,...
    饒嬈閱讀 123評論 0 0
  • 有些人谒臼,似荷朝刊,只能遠觀;有些人蜈缤,如茶拾氓,可以細品;有些人底哥,象風咙鞍,不必在意;有些人趾徽,是樹续滋,值得依靠;一切皆緣也 孵奶。 人...
    美彤媽媽閱讀 186評論 0 10