Java多線程1:進(jìn)程與線程

1.什么是進(jìn)程?

進(jìn)程是操作系統(tǒng)結(jié)構(gòu)的基礎(chǔ),是一次程序的執(zhí)行,是系統(tǒng)進(jìn)行資源分配和調(diào)度的一個(gè)獨(dú)立單位友驮。
這個(gè)解釋有點(diǎn)懵了漂羊。簡(jiǎn)單來(lái)講就是一個(gè)正在操作系統(tǒng)中的運(yùn)行的exe程序就是一個(gè)進(jìn)程。

這里寫圖片描述

2.什么是線程卸留?

線程可以理解為是在進(jìn)程中獨(dú)立運(yùn)行的子任務(wù)走越。比如:酷狗音樂(lè).exe運(yùn)行時(shí),就會(huì)有很多子任務(wù)在同時(shí)運(yùn)行,包括下載歌詞線程耻瑟,直播線程等

3.線程的優(yōu)點(diǎn)

可以在同一時(shí)間內(nèi)運(yùn)行更多不同種類的任務(wù)旨指,比如作為程序員,我們經(jīng)常邊coding,邊聽(tīng)鋼琴曲匆赃,CPU在不同任務(wù)之間飛快切換淤毛,導(dǎo)致一種錯(cuò)覺(jué)---它們是在同時(shí)運(yùn)行的。

這里寫圖片描述

這里寫圖片描述

在單任務(wù)中算柳,Task1需要花費(fèi)100s低淡,而Task2必須要等到Task1執(zhí)行完畢后才能執(zhí)行,這對(duì)Task2來(lái)說(shuō)肯定很不爽瞬项,而在多任務(wù)中蔗蹋,Task2不必等到Task1完成后再執(zhí)行,它們是異步的囱淋,因此猪杭,效率高了。

4.怎樣使用線程妥衣?

實(shí)現(xiàn)多線程編程的方式主要有2種皂吮,一種是extends Thread,一種是implements Runnable.

class MyThread extends  Thread{
    @Override
    public void run() {
        super.run();
        System.out.println("MyThread");
    }
}
public class Run {
    public static void main(String[] args) {
        MyThread myThread = new MyThread();
        myThread.start();
        System.out.println("結(jié)束運(yùn)行");
    }
}

輸出:

結(jié)束運(yùn)行
MyThread

extends Thread的最大弊端在于不支持多繼承税手,為了實(shí)現(xiàn)多繼承蜂筹,可以使用第二種方式implements Runnable.還有,從結(jié)果上來(lái)看芦倒,run方法執(zhí)行的時(shí)間較晚艺挪,也就是說(shuō),在使用多線程技術(shù)時(shí)兵扬,代碼執(zhí)行結(jié)果與代碼執(zhí)行順序是無(wú)關(guān)的麻裳。

這里有一個(gè)坑就是extends Thread的線程多次調(diào)用start()方法會(huì)報(bào)

這里寫圖片描述

這里寫圖片描述

原因在于一個(gè)Thread實(shí)例只能啟動(dòng)一個(gè)線程.

extends Thread 一般不太建議使用,因?yàn)閱卫^承原因器钟,而更推薦implements Runnable接口津坑。
我們先看一下Thread類的構(gòu)造函數(shù),


這里寫圖片描述

可以看到,可以傳遞一個(gè)Runnable接口傲霸,這就好辦了国瓮,我們可以通過(guò)new Thread(Runnable target).start();的方式去啟動(dòng)一個(gè)線程了。還有,Thread(Runnable target)不光可以接收一個(gè)Runnable接口對(duì)象乃摹,還可以接收Thread對(duì)象(因?yàn)門hread implements Runnbale了,多態(tài)嘛)跟衅,這樣做完全可以將一個(gè)Thread對(duì)象的run()交給其他線程去調(diào)用
再來(lái)看一下Runnable接口有什么方法孵睬?

這里寫圖片描述

可以看到,就有唯一的run()伶跷,翻譯過(guò)來(lái)的意思是:"當(dāng)我們implements Runnable時(shí)去創(chuàng)建 一個(gè)線程時(shí)掰读,啟動(dòng)它就會(huì)執(zhí)行run()",而通過(guò)源碼得知Thread類其實(shí)也implements Runnable,因此我們使用run().

class MyRunnable implements Runnable{
    @Override
    public void run() {
        System.out.println("MyRunnable");
    }
}
public class Run {
    public static void main(String[] args) {
        MyRunnable myRunnable = new MyRunnable();
        new Thread(myRunnable).start();
        new Thread(myRunnable).start();
        new Thread(myRunnable).start();
        System.out.println("結(jié)束運(yùn)行");
    }
}

這里同樣多次調(diào)用start()叭莫,但程序是可以正常運(yùn)行的蹈集。這是為什么呢?還是剛剛說(shuō)的那句話一個(gè)Thread實(shí)例只能啟動(dòng)一個(gè)線程雇初,這里3次new Thread拢肆,當(dāng)然不是同一個(gè)實(shí)例啦。

5.實(shí)例變量與線程安全

實(shí)例變量可以對(duì)其他線程有共享和不共享之分靖诗。

比如說(shuō)郭怪,我們創(chuàng)建了3個(gè)線程,每個(gè)線程都有各自的count變量刊橘,它們互不影響鄙才,這就是變量不共享。
共享數(shù)據(jù)的情況就是多個(gè)線程同時(shí)訪問(wèn)同一變量促绵,這時(shí)往往會(huì)出現(xiàn)臟讀現(xiàn)象攒庵。
代碼實(shí)例:

LoginServlet代碼:

public class LoginServlet {
    private static String username;
    private static String password;
    public void dopost(String username,String password){
        LoginServlet.username = username;
        if(username.equals("a")){
            try {
                Thread.sleep(3000);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
        LoginServlet.password=password;
        System.out.println("當(dāng)前線程名稱:"+Thread.currentThread().getName()+"用戶名"+LoginServlet.username+"密碼"+LoginServlet.password);
       

    }
}

運(yùn)行代碼:

class MyThread1 extends Thread {
    LoginServlet loginServlet;

    MyThread1(LoginServlet loginServlet) {
        this.loginServlet = loginServlet;
    }

    @Override
    public void run() {
        super.run();
        loginServlet.dopost("a", "aa");
    }
}

class MyThread2 extends Thread {
    LoginServlet loginServlet;

    MyThread2(LoginServlet loginServlet) {
        this.loginServlet = loginServlet;
    }

    @Override
    public void run() {
        super.run();
        loginServlet.dopost("b", "bb");
    }
}

public class Run {
    public static void main(String[] args) {
        LoginServlet loginServlet = new LoginServlet();
        MyThread1 myThread1 = new MyThread1(loginServlet);
        MyThread2 myThread2 = new MyThread2(loginServlet);
        myThread1.start();
        myThread2.start();
    }
}
這里寫圖片描述

這里出現(xiàn)了臟讀現(xiàn)象,可以通過(guò)加鎖機(jī)制败晴,關(guān)于synchronized加鎖浓冒,下次會(huì)詳細(xì)講解

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市位衩,隨后出現(xiàn)的幾起案子裆蒸,更是在濱河造成了極大的恐慌,老刑警劉巖糖驴,帶你破解...
    沈念sama閱讀 216,591評(píng)論 6 501
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件僚祷,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡贮缕,警方通過(guò)查閱死者的電腦和手機(jī)辙谜,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,448評(píng)論 3 392
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)感昼,“玉大人装哆,你說(shuō)我怎么就攤上這事。” “怎么了蜕琴?”我有些...
    開(kāi)封第一講書(shū)人閱讀 162,823評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵萍桌,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我凌简,道長(zhǎng)上炎,這世上最難降的妖魔是什么? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 58,204評(píng)論 1 292
  • 正文 為了忘掉前任雏搂,我火速辦了婚禮藕施,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘凸郑。我一直安慰自己裳食,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,228評(píng)論 6 388
  • 文/花漫 我一把揭開(kāi)白布芙沥。 她就那樣靜靜地躺著诲祸,像睡著了一般。 火紅的嫁衣襯著肌膚如雪憨愉。 梳的紋絲不亂的頭發(fā)上烦绳,一...
    開(kāi)封第一講書(shū)人閱讀 51,190評(píng)論 1 299
  • 那天,我揣著相機(jī)與錄音配紫,去河邊找鬼径密。 笑死,一個(gè)胖子當(dāng)著我的面吹牛躺孝,可吹牛的內(nèi)容都是我干的享扔。 我是一名探鬼主播,決...
    沈念sama閱讀 40,078評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼植袍,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼惧眠!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起于个,我...
    開(kāi)封第一講書(shū)人閱讀 38,923評(píng)論 0 274
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤氛魁,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后厅篓,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體秀存,經(jīng)...
    沈念sama閱讀 45,334評(píng)論 1 310
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,550評(píng)論 2 333
  • 正文 我和宋清朗相戀三年羽氮,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了或链。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 39,727評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡档押,死狀恐怖澳盐,靈堂內(nèi)的尸體忽然破棺而出祈纯,到底是詐尸還是另有隱情,我是刑警寧澤叼耙,帶...
    沈念sama閱讀 35,428評(píng)論 5 343
  • 正文 年R本政府宣布腕窥,位于F島的核電站,受9級(jí)特大地震影響旬蟋,放射性物質(zhì)發(fā)生泄漏油昂。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,022評(píng)論 3 326
  • 文/蒙蒙 一倾贰、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧拦惋,春花似錦匆浙、人聲如沸。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 31,672評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至言秸,卻和暖如春软能,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背举畸。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 32,826評(píng)論 1 269
  • 我被黑心中介騙來(lái)泰國(guó)打工查排, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人抄沮。 一個(gè)月前我還...
    沈念sama閱讀 47,734評(píng)論 2 368
  • 正文 我出身青樓跋核,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親叛买。 傳聞我的和親對(duì)象是個(gè)殘疾皇子砂代,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,619評(píng)論 2 354

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

  • 本文主要講了java中多線程的使用方法、線程同步率挣、線程數(shù)據(jù)傳遞刻伊、線程狀態(tài)及相應(yīng)的一些線程函數(shù)用法、概述等椒功。 首先講...
    李欣陽(yáng)閱讀 2,454評(píng)論 1 15
  • Java多線程學(xué)習(xí) [-] 一擴(kuò)展javalangThread類 二實(shí)現(xiàn)javalangRunnable接口 三T...
    影馳閱讀 2,957評(píng)論 1 18
  • 一蛾茉、線程的生命周期 線程狀態(tài)轉(zhuǎn)換圖: 1讼呢、新建狀態(tài) 用new關(guān)鍵字和Thread類或其子類建立一個(gè)線程對(duì)象后,該線...
    我是嘻哈大哥閱讀 898評(píng)論 0 8
  • 筆記類文章 常用HTML5語(yǔ)義化標(biāo)簽 結(jié)構(gòu)標(biāo)簽 header nav main article section a...
    布蕾布蕾閱讀 203評(píng)論 0 0
  • 單行文本不折行谦炬,顯示不了的就用省略號(hào)表示HTML代碼<!DOCTYPE html> JS Bin 多行文本固定高度...
    fredah閱讀 6,671評(píng)論 0 0