Java基礎(chǔ)之多線(xiàn)程

多線(xiàn)程

進(jìn)程和線(xiàn)程的關(guān)系姨丈,舉個(gè)形象的例子戳杀。360安全衛(wèi)士就是一個(gè)進(jìn)程,QQ是另外一個(gè)進(jìn)程。在360中俩莽,我們可以同時(shí)進(jìn)行電腦體檢和電腦清理困介,這兩個(gè)功能模塊就是兩個(gè)線(xiàn)程,他們并發(fā)執(zhí)行。

實(shí)現(xiàn)多線(xiàn)程的方法

繼承Thread類(lèi)

Thread類(lèi)中有run()方法辨赐,這個(gè)方法就是封裝自定義線(xiàn)程運(yùn)行任務(wù)的函數(shù),一般覆蓋run()京办。步驟如下

  1. 定義一個(gè)類(lèi)繼承Thread
  2. 覆蓋run方法
  3. 創(chuàng)建Thread子類(lèi)對(duì)象創(chuàng)建線(xiàn)程
  4. 調(diào)用start方法
public class Print extends Thread {
    private int num;

    Print(int num) {
        this.num = num;
    }

    @Override
    public void run() {
        System.out.println("Thread" + num + " Run");
    }
}

class ThreadDemo {
    public static void main(String[] args) {
      // 注意一個(gè)線(xiàn)程只能被start()一次
        while (true) {
            new Print(1).start();
            new Print(2).start();
        }
    }
}
  • CPU執(zhí)行資格:可以被CPU處理掀序,在處理隊(duì)列中排隊(duì)。
  • CPU執(zhí)行權(quán):正在被CPU處理惭婿。
  • 線(xiàn)程凍結(jié)時(shí):放棄了執(zhí)行權(quán)也放棄了執(zhí)行資格不恭。
  • 臨時(shí)阻塞:加入甲乙丙都有執(zhí)行資格,而只有甲有執(zhí)行權(quán)财饥,此時(shí)乙丙就出于臨時(shí)阻塞狀態(tài)换吧,有執(zhí)行資格,無(wú)執(zhí)行權(quán)钥星。

實(shí)現(xiàn)Runnable

若是幾個(gè)線(xiàn)程共用一個(gè)數(shù)據(jù)沾瓦,繼承自Thread就不行了,因?yàn)槊總€(gè)子類(lèi)都有自己的數(shù)據(jù)谦炒。這時(shí)候需要實(shí)現(xiàn)Runnable贯莺。比較以下例子。

public class Bank extrends Thread {
    private int money = 100;

    @Override
    public void run() {
        money--;
        System.out.println(money);
    }

    public static void main(String[] args) {
        new Bank().start();
        new Bank().start();
        new Bank().start();
        new Bank().start();
      // 這里打印四個(gè)99宁改,說(shuō)明每個(gè)線(xiàn)程用的都是自己的的money
    }
}

public class Bank implements Runnable {
    private int money = 100;

    @Override
    public void run() {
        money--;
        System.out.println(money);
    }

    public static void main(String[] args) {
        Bank a = new Bank();
        new Thread(a).start();
        new Thread(a).start();
        new Thread(a).start();
        new Thread(a).start();
      // 傳入某個(gè)特定的Bank缕探,這里打印99,98还蹲,97爹耗,96,實(shí)現(xiàn)Runnable多了線(xiàn)程可以共用一個(gè)數(shù)據(jù)
    }
}

  1. 實(shí)現(xiàn)Runnable接口

  2. 覆蓋run方法

  3. 通過(guò)Thread類(lèi)創(chuàng)建子對(duì)象谜喊,并將Runnable接口子類(lèi)作為T(mén)hread類(lèi)的構(gòu)造函數(shù)參數(shù)進(jìn)行傳遞

    Demo d = new Demo();

    Thread t1 = new Thread(d);

  4. 調(diào)用start方法

實(shí)現(xiàn)Runnable接口的好處

  • 幾個(gè)線(xiàn)程可以共用同一份數(shù)據(jù)
  • 避免了Java單繼承的局限潭兽,比如class Demo extends Fu implements Runnable;一般開(kāi)發(fā)中用這種方式較多。

線(xiàn)程安全

產(chǎn)生原因

  • 多個(gè)線(xiàn)程在共用同一個(gè)數(shù)據(jù)時(shí)
  • 操作共享數(shù)據(jù)的線(xiàn)程代碼有多余斗遏,當(dāng)一個(gè)線(xiàn)程在執(zhí)行操作共享數(shù)據(jù)的多余代碼的過(guò)程中山卦,其他線(xiàn)程又參與運(yùn)算,就會(huì)導(dǎo)致線(xiàn)程安全最易。

解決辦法

解決上述問(wèn)題的方法怒坯,可以封裝這些多余代碼炫狱,當(dāng)一個(gè)線(xiàn)程執(zhí)行時(shí)藻懒,其他線(xiàn)程不能進(jìn)入

synchronized代碼塊

// 這里需要傳入一個(gè)對(duì)象视译,即同步鎖嬉荆,可以看成一個(gè)標(biāo)志位,有一個(gè)線(xiàn)程進(jìn)來(lái)了酷含,就從1 -> 0鄙早,其他線(xiàn)程進(jìn)不去汪茧,等進(jìn)入的線(xiàn)程執(zhí)行完畢后,標(biāo)志位再?gòu)? -> 1
syschronized(Object) {
  // 需要封裝的多余代碼
 
}

同步

  • 同步的好處:課解決線(xiàn)程安全問(wèn)題
  • 同步的缺點(diǎn):效率低限番,因?yàn)橥酵獾木€(xiàn)程都會(huì)判斷同步鎖
  • 同步的前提:多個(gè)線(xiàn)程用了共享的數(shù)據(jù)且共用一把同步鎖舱污,作為鎖的這個(gè)對(duì)象必須在run()方法之外。

同步函數(shù)

// 同步鎖去哪兒了弥虐?這里默認(rèn)用的是this
public synchronized void func() {
 
}

同步代碼塊可以使用任意對(duì)象作為鎖扩灯,而同步函數(shù)只能用this。

若同步函數(shù)是static的霜瘪,用的鎖是該函數(shù)所屬的字節(jié)碼文件對(duì)象珠插,可以用類(lèi)名.class獲取,不能用this.getClass()因?yàn)殪o態(tài)函數(shù)加載的時(shí)候還沒(méi)有對(duì)象

死鎖

  • 嵌套鎖或造成死鎖颖对,即一個(gè)線(xiàn)程拿走了另外一個(gè)線(xiàn)程的鎖捻撑。
  • 所有線(xiàn)程都在線(xiàn)程池也會(huì)死鎖。

進(jìn)程間通信:wait()將線(xiàn)程凍結(jié)缤底,存儲(chǔ)到線(xiàn)程池中等待顾患。notify()會(huì)喚醒線(xiàn)程池中任一個(gè)線(xiàn)程,若本方喚醒了自己个唧,沒(méi)有意義描验,while+notify會(huì)導(dǎo)致死鎖。while+notifyAll可解決坑鱼。

wait()和sleep()

sleep()需要指定時(shí)間膘流,毫秒級(jí)。< -- > wait()課指定時(shí)間也可不指定鲁沥。

sleep()釋放執(zhí)行權(quán)呼股,不釋放鎖。< -- > wait()釋放執(zhí)行權(quán)也釋放鎖画恰。

多線(xiàn)程新特性

以下代碼和synchronized代碼塊作用類(lèi)似彭谁。注意try里是瞎寫(xiě)的,只是為了演示新特性的新方法允扇。

 Lock lock = new ReentrantLock();
// Condition可以和任意的鎖組合使用
        Condition condition = lock.newCondition();
// 在這里上鎖
        lock.lock();
        try {
          // 這三個(gè)函數(shù)相當(dāng)于wait()缠局、notify()、notifyAll()
            condition.await();
            condition.signal();
            condition.signalAll();
          // 最后要釋放鎖
        } finally {
            lock.unlock();
        }

繼承自O(shè)bject的幾個(gè)方法

  • equals() {return this==other}默認(rèn)是比較地址考润∠猎埃可以覆蓋,比如String類(lèi)糊治、Integer類(lèi)覆蓋后比較的是內(nèi)容或值唱矛。

  • hashcode兩個(gè)對(duì)象的哈希值相同,才能說(shuō)他們具有相同的地址。

  • getClass()绎谦,返回此Object的運(yùn)行時(shí)類(lèi)管闷,字節(jié)碼文件對(duì)象。

    Person p1 = new Person();
    Person p2 = new Person();
    // Class xx = p1.getClass();
    p1.getClass() == P2.getClass() // true,兩個(gè)對(duì)象指向的類(lèi)Person
    
  • toString()將對(duì)象轉(zhuǎn)換為字符串窃肠,如直接打印上面的p1包个,其實(shí)默認(rèn)調(diào)用了p1.toString(),其內(nèi)部實(shí)現(xiàn)實(shí)際是返回了多個(gè)由+連接的字符串冤留。

Integer的一些方法

int a = Integer.parseInt("6");
        // 其他進(jìn)制轉(zhuǎn)為十進(jìn)制赃蛛,第二個(gè)參數(shù)為進(jìn)制
        int b = Integer.parseInt("110", 2);
        // 十進(jìn)制轉(zhuǎn)為其他進(jìn)制
        String c = Integer.toBinaryString(6);
        String d = Integer.toHexString(10);
        // 和parseInt和相似的方法,parse返回int搀菩,valueOf返回Integer對(duì)象
        // 其他進(jìn)制轉(zhuǎn)十進(jìn)制
        Integer aa = Integer.valueOf("110", 2);

by @sunhaiyu

2016.12.14

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末呕臂,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子肪跋,更是在濱河造成了極大的恐慌歧蒋,老刑警劉巖,帶你破解...
    沈念sama閱讀 212,383評(píng)論 6 493
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件州既,死亡現(xiàn)場(chǎng)離奇詭異谜洽,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)吴叶,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,522評(píng)論 3 385
  • 文/潘曉璐 我一進(jìn)店門(mén)阐虚,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人蚌卤,你說(shuō)我怎么就攤上這事实束。” “怎么了逊彭?”我有些...
    開(kāi)封第一講書(shū)人閱讀 157,852評(píng)論 0 348
  • 文/不壞的土叔 我叫張陵咸灿,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我侮叮,道長(zhǎng)避矢,這世上最難降的妖魔是什么? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 56,621評(píng)論 1 284
  • 正文 為了忘掉前任囊榜,我火速辦了婚禮审胸,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘卸勺。我一直安慰自己砂沛,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,741評(píng)論 6 386
  • 文/花漫 我一把揭開(kāi)白布孔庭。 她就那樣靜靜地躺著尺上,像睡著了一般。 火紅的嫁衣襯著肌膚如雪圆到。 梳的紋絲不亂的頭發(fā)上怎抛,一...
    開(kāi)封第一講書(shū)人閱讀 49,929評(píng)論 1 290
  • 那天,我揣著相機(jī)與錄音芽淡,去河邊找鬼马绝。 笑死,一個(gè)胖子當(dāng)著我的面吹牛挣菲,可吹牛的內(nèi)容都是我干的富稻。 我是一名探鬼主播,決...
    沈念sama閱讀 39,076評(píng)論 3 410
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼白胀,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼椭赋!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起或杠,我...
    開(kāi)封第一講書(shū)人閱讀 37,803評(píng)論 0 268
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤哪怔,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后向抢,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體认境,經(jīng)...
    沈念sama閱讀 44,265評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,582評(píng)論 2 327
  • 正文 我和宋清朗相戀三年挟鸠,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了叉信。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 38,716評(píng)論 1 341
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡艘希,死狀恐怖硼身,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情覆享,我是刑警寧澤鸠姨,帶...
    沈念sama閱讀 34,395評(píng)論 4 333
  • 正文 年R本政府宣布,位于F島的核電站淹真,受9級(jí)特大地震影響讶迁,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜核蘸,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 40,039評(píng)論 3 316
  • 文/蒙蒙 一巍糯、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧客扎,春花似錦祟峦、人聲如沸。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 30,798評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)针姿。三九已至,卻和暖如春厌衙,著一層夾襖步出監(jiān)牢的瞬間距淫,已是汗流浹背。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 32,027評(píng)論 1 266
  • 我被黑心中介騙來(lái)泰國(guó)打工婶希, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留榕暇,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 46,488評(píng)論 2 361
  • 正文 我出身青樓喻杈,卻偏偏與公主長(zhǎng)得像彤枢,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子筒饰,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,612評(píng)論 2 350

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

  • 寫(xiě)在前面的話(huà): 這篇博客是我從這里“轉(zhuǎn)載”的缴啡,為什么轉(zhuǎn)載兩個(gè)字加“”呢?因?yàn)檫@絕不是簡(jiǎn)單的復(fù)制粘貼瓷们,我花了五六個(gè)小...
    SmartSean閱讀 4,717評(píng)論 12 45
  • Java多線(xiàn)程學(xué)習(xí) [-] 一擴(kuò)展javalangThread類(lèi) 二實(shí)現(xiàn)javalangRunnable接口 三T...
    影馳閱讀 2,952評(píng)論 1 18
  • 本文主要講了java中多線(xiàn)程的使用方法盟猖、線(xiàn)程同步、線(xiàn)程數(shù)據(jù)傳遞换棚、線(xiàn)程狀態(tài)及相應(yīng)的一些線(xiàn)程函數(shù)用法式镐、概述等。 首先講...
    李欣陽(yáng)閱讀 2,444評(píng)論 1 15
  • 1. Java基礎(chǔ)部分 基礎(chǔ)部分的順序:基本語(yǔ)法固蚤,類(lèi)相關(guān)的語(yǔ)法娘汞,內(nèi)部類(lèi)的語(yǔ)法,繼承相關(guān)的語(yǔ)法夕玩,異常的語(yǔ)法你弦,線(xiàn)程的語(yǔ)...
    子非魚(yú)_t_閱讀 31,599評(píng)論 18 399
  • 該文章轉(zhuǎn)自:http://blog.csdn.net/evankaka/article/details/44153...
    加來(lái)依藍(lán)閱讀 7,337評(píng)論 3 87