亚洲中字慕日产2020,大陆极品少妇内射AAAAAA,无码av大香线蕉伊人久久,久久精品国产亚洲av麻豆网站

資訊專欄INFORMATION COLUMN

java 多線程基礎(chǔ)

MarvinZhang / 2768人閱讀

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

進程和線程

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

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

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

文件下載

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

創(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);
        }
    }
}

測試接口:

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

測試結(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);
        }
    }
}

測試接口

@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");
}

測試結(jié)果:

start thread

end thread

循環(huán)i

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

測試接口

@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();
}

測試結(jié)果:

start thread

end thread

循環(huán)i

常見問題

繼承Thread?實現(xiàn)Runnable接口?
推薦使用實現(xiàn)Runnable接口,因為java是單繼承多實現(xiàn)的

start方法?run方法?
start開啟線程,等待cpu去執(zhí)行;run是實例調(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() 判斷該線程是否是守護線程

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

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

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

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

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

start() 啟動線程

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

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

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

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

Stop() 停止線程

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

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



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

轉(zhuǎn)載請注明本文地址:http://www.ezyhdfw.cn/yun/74118.html

相關(guān)文章

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

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

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

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

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

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

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

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

    dreamans 評論0 收藏0
  • 線程編程完全指南

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

    mengera88 評論0 收藏0

發(fā)表評論

0條評論

最新活動
閱讀需要支付1元查看
<