[高并發(fā)]Java高并發(fā)編程系列開山篇--線程實現(xiàn)

Java是最早開始有并發(fā)的語言之一,再過去傳統(tǒng)多任務(wù)的模式下,人們發(fā)現(xiàn)很難解決一些更為復(fù)雜的問題,這個時候我們就有了并發(fā).
引用

? ? ? ?多線程比多任務(wù)更加有挑戰(zhàn)。多線程是在同一個程序內(nèi)部并行執(zhí)行,因此會對相同的內(nèi)存空間進行并發(fā)讀寫操作。這可能是在單線程程序中從來不會遇到的問題。其中的一些錯誤也未必會在單CPU機器上出現(xiàn)逸尖,因為兩個線程從來不會得到真正的并行執(zhí)行。然而,更現(xiàn)代的計算機伴隨著多核CPU的出現(xiàn)蚓庭,也就意味著不同的線程能被不同的CPU核得到真正意義的并行執(zhí)行。


? ? ? ?那么,要開始Java并發(fā)之路,就要開始從java線程開始說起.
? ? ? ?本篇幅將是本系列博客的開山篇,也就是基礎(chǔ)線程的復(fù)習.

線程簡介

線程百科

    線程仅仆,有時被稱為輕量級進程(Lightweight Process器赞,LWP),是程序執(zhí)行流的最小單元墓拜。一個標準的線程由線程ID港柜,當前指令指針(PC),寄存器集合和堆棧組成。另外夏醉,線程是進程中的一個實體爽锥,是被系統(tǒng)獨立調(diào)度和分派的基本單位,線程自己不擁有系統(tǒng)資源畔柔,只擁有一點兒在運行中必不可少的資源氯夷,但它可與同屬一個進程的其它線程共享進程所擁有的全部資源。

線程優(yōu)點

資源利用率更好
程序設(shè)計在某些情況下更簡單
程序響應(yīng)更快

線程代價

設(shè)計更復(fù)雜
上下文切換的開銷上升
增加資源消耗

線程的實現(xiàn)方式

? ? ? ?線程我們有不同的實現(xiàn)方式,生產(chǎn)環(huán)境中用到的也有所不同,那么,我們先來通過Demo看一下每種實現(xiàn)方式的區(qū)別.

通過Thread 實現(xiàn)的線程

public class Demo1 {
    public static void main(String args[]) {
        Thread thread = Thread.currentThread();
        System.out.println("當前線程:" + thread);

        thread.setName("hyh thread");//修改線程名稱

        System.out.println("修改名稱之后:" + thread);

        try {
            for (int a = 5; a > 0; a--) {
                System.out.println(a);

                thread.sleep(1000);
            }
        } catch (Exception e) {
            System.out.println("出現(xiàn)異常");
        }
    }

通過集成Runnable接口實現(xiàn)

Demo2.class 清單:

public class Demo2 implements Runnable {

    Thread t;

    //空構(gòu)造函數(shù)
    Demo2() {
        t = new Thread(this, "測試線程");
        System.out.println("子線程" + t);
        t.start();
    }

    public void run() {
        try {
            for (int a = 5; a > 0; a--) {
                System.out.println("子線程" + a);
                Thread.sleep(1000);
            }
        } catch (InterruptedException e) {
            System.out.println("異常");
        }
        System.out.println("退出子線程");
    }
}

/**
 * 主類
 */
class ThreadDemo {
    public static void main(String args[]) {
        new Demo2();//創(chuàng)建一個新線程
        try {
            for (int i = 5; i > 0; i--) {
                System.out.println("主線程:" + i);
                Thread.sleep(1000);
            }
        } catch (InterruptedException e) {
            System.out.println("主線程異常");
        }
        //主線程退出
        System.out.println("主線程退出");

    }
}

通過集成 Thread 重寫run方法實現(xiàn)

public class Demo3 extends Thread {
    public Demo3() {
        //創(chuàng)建新線程
        super("線程Demo");
        System.out.println("子線程:" + this);
        start();
    }

    @Override
    public void run() {
        try {
            for (int a = 5; a > 0; a--) {
                System.out.println("子線程:" + a);
                Thread.sleep(500);
            }
        } catch (InterruptedException e) {
            System.out.println("子程序異常");
        }
    }

}

class MasterThread {
    public static void main(String args[]) {
        new Demo3();//創(chuàng)建新線程

        try {
            for (int i = 5; i > 0; i--) {
                System.out.println("主線程:" + i);
                Thread.sleep(1000);
            }
        } catch (InterruptedException e) {
            System.out.println("主程序異常");
        }
        System.out.println("主程序退出...");
    }
}

三個線程的實現(xiàn)

在日常生產(chǎn)中,使用線程可以通過實現(xiàn)Runnable接口.下面我們通過該方法實現(xiàn)簡單的三個線程Demo

結(jié)構(gòu): 創(chuàng)建一個Demo4類,另外一個主類MultThreadDemo.
清單:

 public class Demo4 implements Runnable {
 //全局變量
    String name;
    Thread thread;

    //構(gòu)造器
    public Demo4(String th) {
        name = th;
        thread = new Thread(this, name);
        System.out.println("新線程" + thread);
        //開始線程
        thread.start();
    }

    //重寫run方法
    public void run() {
        try {
            for (int a = 5; a > 0; a--) {
                System.out.println(name + ":" + a);
                Thread.sleep(1000);
            }
        } catch (InterruptedException e) {
            System.out.println("異常");
        }
        System.out.println(name + "線程結(jié)束");
    }
}

/**
 * 測試類
 *
 * @author hyh
 */
class MultThreadDemo {

    public static void main(String[] args) {
        //創(chuàng)建三個線程
        Demo4 thread_1 = new Demo4("線程一");
        Demo4 thread_2 = new Demo4("線程二");
        Demo4 thread_3 = new Demo4("線程三");
        //查看狀態(tài)
        System.out.println("線程一狀態(tài):" + thread_1.thread.isAlive());
        System.out.println("線程二狀態(tài):" + thread_2.thread.isAlive());
        System.out.println("線程三狀態(tài):" + thread_3.thread.isAlive());

        try {
            System.out.println("等待其他線程結(jié)束");
            //使用join確保主線程最后運行
            thread_1.thread.join();
            thread_2.thread.join();
            thread_3.thread.join();
        } catch (InterruptedException e) {
            System.out.println("線程異常");

        }
        //查看狀態(tài)
        System.out.println("線程一:" + thread_1.thread.isAlive());
        System.out.println("線程二:" + thread_2.thread.isAlive());
        System.out.println("線程三:" + thread_3.thread.isAlive());
    }
}

到此,開山Demo完成.
本文源碼Github地址:
https://github.com/hanyahong/com-hanyahong-blog/tree/master/com-hanyahong-thread-1/src/main/java/com/hyh/thread

思考:進程與線程的比較

進程
資源分配的基本單位靶擦。
所有與該進程有關(guān)的資源肠槽,都被記錄在進程控制塊PCB中。
進程處理機的調(diào)度單位奢啥,擁有完整的虛擬地址空間秸仙。當進程發(fā)生調(diào)度時,不同的進程擁有不同的虛擬地址空間桩盲,而同一進程內(nèi)的不同線程共享同一地址空間寂纪。
線程與資源分配無關(guān),屬于某一個進程赌结,并與其他線程共享進程資源捞蛋。
線程只由相關(guān)堆棧(系統(tǒng)棧或用戶棧)寄存器和線程控制表TCB組成柬姚。寄存器可被用來存儲線程內(nèi)的局部變量拟杉,但不能存儲其他線程的相關(guān)變量。
進程在多線程中量承,進程不是一個可執(zhí)行的實體搬设。

兩者比較:
調(diào)度和切換:線程上下文切換比進程上下文切換要快得多。
通信:進程間通信IPC撕捍,線程間可以直接讀寫進程數(shù)據(jù)段(如全局變量)來進行通信——需要進程同步和互斥手段的輔助拿穴,以保證數(shù)據(jù)的一致性。
地址空間和其它資源(如打開文件):進程間相互獨立忧风,同一進程的各線程間共享默色。某進程內(nèi)的線程在其它進程不可見。

(本篇完)
WeChat: wixf150
原創(chuàng)文章狮腿,轉(zhuǎn)發(fā)請注明出處:http://www.cnblogs.com/hyhnet/p/6250264.html
訪問獨立站點,獲得更好用戶體驗:http://www.hanyahong.com

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末腿宰,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子缘厢,更是在濱河造成了極大的恐慌吃度,老刑警劉巖,帶你破解...
    沈念sama閱讀 206,214評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件昧绣,死亡現(xiàn)場離奇詭異规肴,居然都是意外死亡捶闸,警方通過查閱死者的電腦和手機夜畴,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,307評論 2 382
  • 文/潘曉璐 我一進店門拖刃,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人贪绘,你說我怎么就攤上這事兑牡。” “怎么了税灌?”我有些...
    開封第一講書人閱讀 152,543評論 0 341
  • 文/不壞的土叔 我叫張陵均函,是天一觀的道長。 經(jīng)常有香客問我菱涤,道長苞也,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 55,221評論 1 279
  • 正文 為了忘掉前任粘秆,我火速辦了婚禮如迟,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘攻走。我一直安慰自己殷勘,他們只是感情好,可當我...
    茶點故事閱讀 64,224評論 5 371
  • 文/花漫 我一把揭開白布昔搂。 她就那樣靜靜地躺著玲销,像睡著了一般。 火紅的嫁衣襯著肌膚如雪摘符。 梳的紋絲不亂的頭發(fā)上贤斜,一...
    開封第一講書人閱讀 49,007評論 1 284
  • 那天,我揣著相機與錄音逛裤,去河邊找鬼蠢古。 笑死,一個胖子當著我的面吹牛别凹,可吹牛的內(nèi)容都是我干的草讶。 我是一名探鬼主播,決...
    沈念sama閱讀 38,313評論 3 399
  • 文/蒼蘭香墨 我猛地睜開眼炉菲,長吁一口氣:“原來是場噩夢啊……” “哼堕战!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起拍霜,我...
    開封第一講書人閱讀 36,956評論 0 259
  • 序言:老撾萬榮一對情侶失蹤嘱丢,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后祠饺,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體越驻,經(jīng)...
    沈念sama閱讀 43,441評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 35,925評論 2 323
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了缀旁。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片记劈。...
    茶點故事閱讀 38,018評論 1 333
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖并巍,靈堂內(nèi)的尸體忽然破棺而出目木,到底是詐尸還是另有隱情,我是刑警寧澤懊渡,帶...
    沈念sama閱讀 33,685評論 4 322
  • 正文 年R本政府宣布刽射,位于F島的核電站,受9級特大地震影響剃执,放射性物質(zhì)發(fā)生泄漏誓禁。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 39,234評論 3 307
  • 文/蒙蒙 一肾档、第九天 我趴在偏房一處隱蔽的房頂上張望现横。 院中可真熱鬧,春花似錦阁最、人聲如沸戒祠。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,240評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽姜盈。三九已至,卻和暖如春配阵,著一層夾襖步出監(jiān)牢的瞬間馏颂,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,464評論 1 261
  • 我被黑心中介騙來泰國打工棋傍, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留救拉,地道東北人。 一個月前我還...
    沈念sama閱讀 45,467評論 2 352
  • 正文 我出身青樓瘫拣,卻偏偏與公主長得像亿絮,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子麸拄,可洞房花燭夜當晚...
    茶點故事閱讀 42,762評論 2 345

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

  • Android 自定義View的各種姿勢1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 171,501評論 25 707
  • 下面是我自己收集整理的Java線程相關(guān)的面試題派昧,可以用它來好好準備面試。 參考文檔:-《Java核心技術(shù) 卷一》-...
    阿呆變Geek閱讀 14,738評論 14 507
  • 從三月份找實習到現(xiàn)在拢切,面了一些公司蒂萎,掛了不少,但最終還是拿到小米淮椰、百度五慈、阿里纳寂、京東、新浪泻拦、CVTE毙芜、樂視家的研發(fā)崗...
    時芥藍閱讀 42,184評論 11 349
  • 最不可靠的東西閱讀 201評論 1 0
  • 我叫張秀麗!來自陜西澄城澄合礦務(wù)局鐵運處的一名退休職工聪轿,從2012年開始患上了失眠爷肝,一晚上睡不了二個小時...
    王曉淋閱讀 709評論 0 0