成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專欄INFORMATION COLUMN

java 多線程基礎(chǔ)

MarvinZhang / 2721人閱讀

摘要:每個(gè)進(jìn)程包含一到多個(gè)線程。所以線程基本上是輕量級(jí)的進(jìn)程,它負(fù)責(zé)在單個(gè)程序里執(zhí)行多任務(wù)。通常由操作系統(tǒng)負(fù)責(zé)多個(gè)線程的調(diào)度和執(zhí)行。因此此時(shí)可能有多個(gè)線程處于就緒狀態(tài)。

進(jìn)程和線程

每個(gè)正在系統(tǒng)上運(yùn)行的程序都是一個(gè)進(jìn)程。每個(gè)進(jìn)程包含一到多個(gè)線程。線程是一組指令的集合,或者是程序的特殊段,它可以在程序里獨(dú)立執(zhí)行。也可以把它理解為代碼運(yùn)行的上下文。所以線程基本上是輕量級(jí)的進(jìn)程,它負(fù)責(zé)在單個(gè)程序里執(zhí)行多任務(wù)。通常由操作系統(tǒng)負(fù)責(zé)多個(gè)線程的調(diào)度和執(zhí)行。
使用線程可以把占據(jù)時(shí)間長(zhǎng)的程序中的任務(wù)放到后臺(tái)去處理,程序的運(yùn)行速度可能加快,在一些等待的任務(wù)實(shí)現(xiàn)上如用戶輸入、文件讀寫和網(wǎng)絡(luò)收發(fā)數(shù)據(jù)等,線程就比較有用了。在這種情況下可以釋放一些珍貴的資源如內(nèi)存占用等等。
如果有大量的線程,會(huì)影響性能,因?yàn)椴僮飨到y(tǒng)需要在它們之間切換,更多的線程需要更多的內(nèi)存空間,線程的中止需要考慮其對(duì)程序運(yùn)行的影響。通常塊模型數(shù)據(jù)是在多個(gè)線程間共享的,需要防止線程死鎖情況的發(fā)生。
總結(jié):進(jìn)程是所有線程的集合,每一個(gè)線程是進(jìn)程中的一條執(zhí)行路徑。
推薦閱讀:http://www.ruanyifeng.com/blo...

多線程應(yīng)用場(chǎng)景

后臺(tái)發(fā)送郵件或者短信

文件下載

數(shù)據(jù)庫(kù)連接池

創(chuàng)建方式 繼承Thread類 重寫run方法

MyThread:

public class MyThread extends Thread {
    @Override
    public void run() {
        for (int i = 0; i < 10; i++) {
            System.out.println("i = " + i);
        }
    }
}

測(cè)試接口:

@GetMapping("test-my-thread")
public void testMyThead() {
    MyThread myThread = new MyThread();
    System.out.println("start thread");
    myThread.start();
    System.out.println("end thread");
}

測(cè)試結(jié)果:

start thread

end thread

循環(huán)i

Runnable接口,重寫run方法

Mythread2

public class Mythread2 implements Runnable {
    @Override
    public void run() {
        for (int i = 0; i < 10; i++) {
            System.out.println("i = " + i);
        }
    }
}

測(cè)試接口

@GetMapping("test-my-thread2")
public void testMyThead2() {
    Mythread2 mythread2 = new Mythread2();
    System.out.println("start thread");
    new Thread(mythread2).start();
    System.out.println("end thread");
}

測(cè)試結(jié)果:

start thread

end thread

循環(huán)i

使用匿名內(nèi)部類方式

測(cè)試接口

@GetMapping("test-my-thread3")
public void testMyThead3() {
    new Thread(() -> {
        System.out.println("start thread");
        for (int i = 0; i < 10; i++) {
            System.out.println("i = " + i);
        }
        System.out.println("end thread");
    }).start();
}

測(cè)試結(jié)果:

start thread

end thread

循環(huán)i

常見問題

繼承Thread?實(shí)現(xiàn)Runnable接口?
推薦使用實(shí)現(xiàn)Runnable接口,因?yàn)閖ava是單繼承多實(shí)現(xiàn)的

start方法?run方法?
start開啟線程,等待cpu去執(zhí)行;run是實(shí)例調(diào)用

常用API 常用線程構(gòu)造函數(shù)

Thread() 無參構(gòu)造

Thread(String name) 指定Thread名稱

Thread(Runable r) 參數(shù)為Runable

Thread(Runable r, String name) 參數(shù)為Runable和Thread名稱

Thread關(guān)于自身信息的API

setName(String name)/getName() 讀寫線程名稱

isDaemon() 判斷該線程是否是守護(hù)線程

getId() 獲取當(dāng)前jvm中該線程的唯一標(biāo)示

isAlive() 判斷該線程是否存活,標(biāo)準(zhǔn)是線程已啟動(dòng)但還沒有執(zhí)行完畢

getState() 獲取該線程狀態(tài),返回值為枚舉,包括NEW、RUNNABLE、BLOCKED、WAITING、TIMED_WAITING和TERMINATED

currentThread() 獲取當(dāng)前線程對(duì)象

Thread關(guān)于執(zhí)行的API

start() 啟動(dòng)線程

run() 實(shí)例方法執(zhí)行線程代碼,并沒有啟動(dòng)一個(gè)新的線程

join(long millis, int nanos) 保證指定時(shí)間以內(nèi),在JVM中只有該線程在運(yùn)行。millis是等待的毫秒數(shù),nanos是微秒數(shù)(參數(shù)可省)。如果millis填0,則一直等到當(dāng)前線程執(zhí)行完畢,JVM才會(huì)調(diào)度其他線程執(zhí)行

yield() 當(dāng)該線程讓出CPU,給其他線程一個(gè)獲取調(diào)度的機(jī)會(huì),但是不確保一定會(huì)調(diào)度到其他線程上

sleep(long millis, int nanos) 讓該線程在指定時(shí)間以內(nèi)休眠,需要注意的是在休眠過程中該線程不會(huì)釋放持有的鎖。millis是等待的毫秒數(shù),nanos是微秒數(shù)(參數(shù)可省)

Stop() 停止線程

多線程運(yùn)行狀態(tài)

新建狀態(tài)
當(dāng)用new操作符創(chuàng)建一個(gè)線程時(shí), 例如new Thread(r),線程還沒有開始運(yùn)行,此時(shí)線程處在新建狀態(tài)。 當(dāng)一個(gè)線程處于新生狀態(tài)時(shí),程序還沒有開始運(yùn)行線程中的代碼
就緒狀態(tài)
一個(gè)新創(chuàng)建的線程并不自動(dòng)開始運(yùn)行,要執(zhí)行線程,必須調(diào)用線程的start()方法。當(dāng)線程對(duì)象調(diào)用start()方法即啟動(dòng)了線程,start()方法創(chuàng)建線程運(yùn)行的系統(tǒng)資源,并調(diào)度線程運(yùn)行run()方法。當(dāng)start()方法返回后,線程就處于就緒狀態(tài)。
處于就緒狀態(tài)的線程并不一定立即運(yùn)行run()方法,線程還必須同其他線程競(jìng)爭(zhēng)CPU時(shí)間,只有獲得CPU時(shí)間才可以運(yùn)行線程。因?yàn)樵趩蜟PU的計(jì)算機(jī)系統(tǒng)中,不可能同時(shí)運(yùn)行多個(gè)線程,一個(gè)時(shí)刻僅有一個(gè)線程處于運(yùn)行狀態(tài)。因此此時(shí)可能有多個(gè)線程處于就緒狀態(tài)。對(duì)多個(gè)處于就緒狀態(tài)的線程是由Java運(yùn)行時(shí)系統(tǒng)的線程調(diào)度程序(thread scheduler)來調(diào)度的。
運(yùn)行狀態(tài)
當(dāng)線程獲得CPU時(shí)間后,它才進(jìn)入運(yùn)行狀態(tài),真正開始執(zhí)行run()方法.
阻塞狀態(tài)
線程運(yùn)行過程中,可能由于各種原因進(jìn)入阻塞狀態(tài):
    1. 線程通過調(diào)用sleep方法進(jìn)入睡眠狀態(tài);
    2. 線程調(diào)用一個(gè)在I/O上被阻塞的操作,即該操作在輸入輸出操作完成之前不會(huì)返回到它的調(diào)用者;
    3. 線程試圖得到一個(gè)鎖,而該鎖正被其他線程持有;
    4. 線程在等待某個(gè)觸發(fā)條件;
死亡狀態(tài)
有兩個(gè)原因會(huì)導(dǎo)致線程死亡:
1) run方法正常退出而自然死亡,
2) 一個(gè)未捕獲的異常終止了run方法而使線程猝死。
為了確定線程在當(dāng)前是否存活著(就是要么是可運(yùn)行的,要么是被阻塞了),需要使用isAlive方法。如果是可運(yùn)行或被阻塞,這個(gè)方法返回true; 如果線程仍舊是new狀態(tài)且不是可運(yùn)行的, 或者線程死亡了,則返回false.



文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/74118.html

相關(guān)文章

  • java 基礎(chǔ) - 收藏集 - 掘金

    摘要:基礎(chǔ)知識(shí)復(fù)習(xí)后端掘金的作用表示靜態(tài)修飾符,使用修飾的變量,在中分配內(nèi)存后一直存在,直到程序退出才釋放空間。將對(duì)象編碼為字節(jié)流稱之為序列化,反之將字節(jié)流重建成對(duì)象稱之為反序列化。 Java 學(xué)習(xí)過程|完整思維導(dǎo)圖 - 后端 - 掘金JVM 1. 內(nèi)存模型( 內(nèi)存分為幾部分? 堆溢出、棧溢出原因及實(shí)例?線上如何排查?) 2. 類加載機(jī)制 3. 垃圾回收 Java基礎(chǔ) 什么是接口?什么是抽象...

    makeFoxPlay 評(píng)論0 收藏0
  • Java學(xué)習(xí)路線總結(jié),搬磚工逆襲Java架構(gòu)師(全網(wǎng)最強(qiáng))

    摘要:哪吒社區(qū)技能樹打卡打卡貼函數(shù)式接口簡(jiǎn)介領(lǐng)域優(yōu)質(zhì)創(chuàng)作者哪吒公眾號(hào)作者架構(gòu)師奮斗者掃描主頁(yè)左側(cè)二維碼,加入群聊,一起學(xué)習(xí)一起進(jìn)步歡迎點(diǎn)贊收藏留言前情提要無意間聽到領(lǐng)導(dǎo)們的談話,現(xiàn)在公司的現(xiàn)狀是碼農(nóng)太多,但能獨(dú)立帶隊(duì)的人太少,簡(jiǎn)而言之,不缺干 ? 哪吒社區(qū)Java技能樹打卡?【打卡貼 day2...

    Scorpion 評(píng)論0 收藏0
  • JAVA 線程和并發(fā)基礎(chǔ)

    摘要:線程可以被稱為輕量級(jí)進(jìn)程。一個(gè)守護(hù)線程是在后臺(tái)執(zhí)行并且不會(huì)阻止終止的線程。其他的線程狀態(tài)還有,和。上下文切換是多任務(wù)操作系統(tǒng)和多線程環(huán)境的基本特征。在的線程中并沒有可供任何對(duì)象使用的鎖和同步器。 原文:Java Multi-Threading and Concurrency Interview Questions with Answers 翻譯:并發(fā)編程網(wǎng) - 鄭旭東 校對(duì):方騰飛 多...

    vboy1010 評(píng)論0 收藏0
  • JAVA 線程和并發(fā)基礎(chǔ)面試問答

    摘要:多線程和并發(fā)問題是技術(shù)面試中面試官比較喜歡問的問題之一。線程可以被稱為輕量級(jí)進(jìn)程。一個(gè)守護(hù)線程是在后臺(tái)執(zhí)行并且不會(huì)阻止終止的線程。其他的線程狀態(tài)還有,和。上下文切換是多任務(wù)操作系統(tǒng)和多線程環(huán)境的基本特征。 多線程和并發(fā)問題是 Java 技術(shù)面試中面試官比較喜歡問的問題之一。在這里,從面試的角度列出了大部分重要的問題,但是你仍然應(yīng)該牢固的掌握J(rèn)ava多線程基礎(chǔ)知識(shí)來對(duì)應(yīng)日后碰到的問題。(...

    dreamans 評(píng)論0 收藏0
  • 線程編程完全指南

    摘要:在這個(gè)范圍廣大的并發(fā)技術(shù)領(lǐng)域當(dāng)中多線程編程可以說是基礎(chǔ)和核心,大多數(shù)抽象并發(fā)問題的構(gòu)思與解決都是基于多線程模型來進(jìn)行的。一般來說,多線程程序會(huì)面臨三類問題正確性問題效率問題死鎖問題。 多線程編程或者說范圍更大的并發(fā)編程是一種非常復(fù)雜且容易出錯(cuò)的編程方式,但是我們?yōu)槭裁催€要冒著風(fēng)險(xiǎn)艱辛地學(xué)習(xí)各種多線程編程技術(shù)、解決各種并發(fā)問題呢? 因?yàn)椴l(fā)是整個(gè)分布式集群的基礎(chǔ),通過分布式集群不僅可以大...

    mengera88 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

最新活動(dòng)
閱讀需要支付1元查看
<