Java中的線程

線程的組成部分:
大致結(jié)構(gòu)
1.線程基本信息
  • 線程ID(Thread ID): 線程的唯一標(biāo)識符,同一個進(jìn)程內(nèi)不同線程ID不會重疊.
  • 線程名稱: 方便用戶識別,系統(tǒng)會自動分配名稱,也可以用戶指定.
  • 線程優(yōu)先級: 表示線程調(diào)度的優(yōu)先級,優(yōu)先級越高活的CPU執(zhí)行的機(jī)會就越大.
  • 線程狀態(tài): 標(biāo)識線程的執(zhí)行狀態(tài),為新建/就緒/運(yùn)行/阻塞/結(jié)束等狀態(tài)的一種.
  • 其他: 是否為守護(hù)線程等等
2.程序計(jì)數(shù)器

在線程的結(jié)構(gòu)中,程序計(jì)數(shù)器很重要,它記錄著線程下一條指令的代碼段內(nèi)存地址.

3.棧內(nèi)存信息

在線程的結(jié)構(gòu)中,程序計(jì)數(shù)器很重要,它記錄著線程下一條指令的代碼段內(nèi)存地址.

線程和進(jìn)程的區(qū)別

  1. 一個進(jìn)程由一個或者多個線程組成.
  2. 線程是CPU的最小調(diào)度單元,進(jìn)程是操作系統(tǒng)分配資源的最小單位.
  3. 一個進(jìn)程內(nèi)線程是可以并發(fā)執(zhí)行的.
  4. 進(jìn)程之間是相互獨(dú)立的,但是一個進(jìn)程內(nèi)的多個線程并不是完全獨(dú)立的. 各個線程共享方法區(qū)內(nèi)存,堆內(nèi)存,系統(tǒng)資源等.
  5. 進(jìn)程和線程的上下文切換速度不同. 線程的速度比進(jìn)程要快得多.

Thread類

一個線程在Java中使用一個Thread實(shí)例來描述, Thread類是Java語言的一個重要的基礎(chǔ)類, 位于java.lang包中.
常用Thread的屬性和方法:

public class Thread implements Runnable {
    private long tid; 線程的ID, 由線程自己分配
    private volatile String name; 線程的名稱, 可以手動設(shè)置(setName())
    private int priority; 線程的優(yōu)先級, 默認(rèn)5, 最小1, 最大10
    private ThreadGroup group; 線程所屬的線程組
    private ClassLoader contextClassLoader; 次線程上下文ClassLoader
    private boolean daemon = false; 是否是守護(hù)線程
    private volatile int threadStatus = 0; 線程的狀態(tài). 對應(yīng)靜態(tài)枚舉類Stete

    public void run(){} 線程的功能方法
    public synchronized void start(){} 線程準(zhǔn)備就緒,等待程序調(diào)用run()方法. 異步操作, 調(diào)用順序不代表實(shí)際啟動的順序.
    public final void stop(){} 終止當(dāng)前線程, 不建議使用
    public static native void sleep(long var0){} 指定毫秒數(shù)讓正在執(zhí)行的線程暫停, 具體取決于系統(tǒng)定時器和調(diào)度程序的精度和準(zhǔn)確性
    public final void setPriority(int var1){} 設(shè)置優(yōu)先級, 不一定有用, 影響線程執(zhí)行優(yōu)先級的因素很多
    public final void setDaemon(boolean var1){} 設(shè)置守護(hù)線程標(biāo)識
    public static native void yield(){} 放棄當(dāng)前CPU執(zhí)行資源,放棄時間不確定
    public final native boolean isAlive(){} 判斷線程是否處于活動狀態(tài). 活動狀態(tài): 啟動未終止
    public final void resume(){} 恢復(fù)線程, 不建議使用
    public final void suspend(){} 暫停線程, 不建議使用
    public void interrupt(){} 中斷線程
    public static boolean interrupted(){} 測試當(dāng)前線程是否中斷, 并且具備清除狀態(tài)的功能
    public boolean isInterrupted(){} 測試當(dāng)前線程是否中斷
    public final void join(){} 等待調(diào)用的這個線程終止
    public Thread.State getState(){} 獲取線程狀態(tài)

    public static enum State {
        NEW, 新建
        RUNNABLE, 就緒, 運(yùn)行
        BLOCKED, 阻塞
        WAITING, 等待
        TIMED_WAITING, 計(jì)時等待
        TERMINATED; 結(jié)束
        private State() {
        }
    }
}

創(chuàng)建線程的方法一

  1. 繼承Thread類.
  2. 重寫run()方法, 編寫并發(fā)業(yè)務(wù)代碼.
public class ThreadDemo extends Thread {

    @Override
    public void run() {
        //并發(fā)代碼
        // TODO
    }
    
    public static void main(String args[]) {
        ThreadDemo threadDemo = new ThreadDemo();
        threadDemo.start();
    }
}

創(chuàng)建線程的方法二

  1. 實(shí)現(xiàn)Runnable接口
  2. 重寫run()方法, 編寫并發(fā)業(yè)務(wù)代碼.
public class RunnableDemo implements Runnable {

    @Override
    public void run() {
        //并發(fā)代碼
        // TODO
    }

    public static void main(String args[]) {
        Thread thread = new Thread(new RunnableDemo(), "runnable測試線程");
        thread.start();
    }
}

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

  1. 實(shí)現(xiàn)Callable接口(泛型接口, 函數(shù)式接口).
  2. 實(shí)現(xiàn)call()方法, 有返回值.
public class CallableDemo implements Callable<String> {
    @Override
    public String call() throws Exception {
        //并發(fā)代碼
        // TODO
        return "OK";
    }

    public static void main(String args[]) throws ExecutionException, InterruptedException {
        CallableDemo callableDemo = new CallableDemo();
        FutureTask<String> futureTask = new FutureTask<>(callableDemo);
        new Thread(futureTask).start();
        String result = futureTask.get();
        System.out.println("返回值: " + result);
    }
}
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末灸拍,一起剝皮案震驚了整個濱河市巡语,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌姻氨,老刑警劉巖,帶你破解...
    沈念sama閱讀 222,590評論 6 517
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件音瓷,死亡現(xiàn)場離奇詭異,居然都是意外死亡机蔗,警方通過查閱死者的電腦和手機(jī)闰非,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 95,157評論 3 399
  • 文/潘曉璐 我一進(jìn)店門膘格,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人财松,你說我怎么就攤上這事瘪贱。” “怎么了辆毡?”我有些...
    開封第一講書人閱讀 169,301評論 0 362
  • 文/不壞的土叔 我叫張陵菜秦,是天一觀的道長。 經(jīng)常有香客問我舶掖,道長球昨,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 60,078評論 1 300
  • 正文 為了忘掉前任眨攘,我火速辦了婚禮主慰,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘鲫售。我一直安慰自己共螺,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 69,082評論 6 398
  • 文/花漫 我一把揭開白布龟虎。 她就那樣靜靜地躺著璃谨,像睡著了一般。 火紅的嫁衣襯著肌膚如雪鲤妥。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 52,682評論 1 312
  • 那天拱雏,我揣著相機(jī)與錄音棉安,去河邊找鬼。 笑死铸抑,一個胖子當(dāng)著我的面吹牛贡耽,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播鹊汛,決...
    沈念sama閱讀 41,155評論 3 422
  • 文/蒼蘭香墨 我猛地睜開眼蒲赂,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了刁憋?” 一聲冷哼從身側(cè)響起滥嘴,我...
    開封第一講書人閱讀 40,098評論 0 277
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎至耻,沒想到半個月后若皱,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體镊叁,經(jīng)...
    沈念sama閱讀 46,638評論 1 319
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,701評論 3 342
  • 正文 我和宋清朗相戀三年走触,在試婚紗的時候發(fā)現(xiàn)自己被綠了晦譬。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 40,852評論 1 353
  • 序言:一個原本活蹦亂跳的男人離奇死亡互广,死狀恐怖敛腌,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情惫皱,我是刑警寧澤迎瞧,帶...
    沈念sama閱讀 36,520評論 5 351
  • 正文 年R本政府宣布,位于F島的核電站逸吵,受9級特大地震影響凶硅,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜扫皱,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 42,181評論 3 335
  • 文/蒙蒙 一足绅、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧韩脑,春花似錦氢妈、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,674評論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至进苍,卻和暖如春加缘,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背觉啊。 一陣腳步聲響...
    開封第一講書人閱讀 33,788評論 1 274
  • 我被黑心中介騙來泰國打工拣宏, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人杠人。 一個月前我還...
    沈念sama閱讀 49,279評論 3 379
  • 正文 我出身青樓勋乾,卻偏偏與公主長得像,于是被迫代替她去往敵國和親嗡善。 傳聞我的和親對象是個殘疾皇子辑莫,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,851評論 2 361

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