内射老阿姨1区2区3区4区_久久精品人人做人人爽电影蜜月_久久国产精品亚洲77777_99精品又大又爽又粗少妇毛片

java中怎么實現(xiàn)多線程

java中怎么實現(xiàn)多線程 ,針對這個問題,這篇文章詳細(xì)介紹了相對應(yīng)的分析和解答,希望可以幫助更多想解決這個問題的小伙伴找到更簡單易行的方法。

公司主營業(yè)務(wù):成都做網(wǎng)站、網(wǎng)站制作、移動網(wǎng)站開發(fā)等業(yè)務(wù)。幫助企業(yè)客戶真正實現(xiàn)互聯(lián)網(wǎng)宣傳,提高企業(yè)的競爭能力。創(chuàng)新互聯(lián)是一支青春激揚、勤奮敬業(yè)、活力青春激揚、勤奮敬業(yè)、活力澎湃、和諧高效的團(tuán)隊。公司秉承以“開放、自由、嚴(yán)謹(jǐn)、自律”為核心的企業(yè)文化,感謝他們對我們的高要求,感謝他們從不同領(lǐng)域給我們帶來的挑戰(zhàn),讓我們激情的團(tuán)隊有機(jī)會用頭腦與智慧不斷的給客戶帶來驚喜。創(chuàng)新互聯(lián)推出簡陽免費做網(wǎng)站回饋大家。

一、概述

  • 理解多線程先要理解線程,理解線程先要理解進(jìn)程。

1. 進(jìn)程

  • 一個正在執(zhí)行的程序。

  • 每個進(jìn)程的執(zhí)行都有一個執(zhí)行的順序,順序是一個執(zhí)行路徑,也叫一個控制單元。

2. 線程

  • 進(jìn)程中獨立的控制單元稱為線程。

  • 線程控制進(jìn)程的執(zhí)行。

  • 進(jìn)程中只要有一個線程在執(zhí)行,進(jìn)程就不會結(jié)束。

  • 一個進(jìn)程中至少存在一個線程。

3. 多線程

  • Java 虛擬機(jī)啟動時,會有一個 java.exe 的執(zhí)行程序,也就是一個進(jìn)程。

  • 這個進(jìn)程中至少存在一個線程負(fù)責(zé) java 程序的執(zhí)行,這個線程的運行代碼存在 main 方法中,這個線程稱之為主線程。

  • JVM 啟動時除了執(zhí)行一個主線程,還會啟動負(fù)責(zé)垃圾回收機(jī)制的線程。

  • 在一個進(jìn)程中有多個線程執(zhí)行的方式,稱為多線程。

4. 多線程的意義

  • 多線程能讓程序產(chǎn)生同時運行的效果,可以提高程序執(zhí)行的效率。

    • java.exe 進(jìn)程執(zhí)行主程序時,如果程序的代碼非常多,在堆內(nèi)存中會產(chǎn)生很多對象,而對象調(diào)用完后就會變成垃圾。如果垃圾過多的話,可能會導(dǎo)致堆內(nèi)存出現(xiàn)內(nèi)存不足的現(xiàn)象,影響程序的運行。這種情況下,如果只有一個線程在運行處理的話,程序執(zhí)行的效率非常低;如果有多個線程在幫助處理的話,程序執(zhí)行的效率將大大的提高。

    • 例如:垃圾回收機(jī)制的線程在幫助進(jìn)行垃圾回收的話,那堆內(nèi)存空間的釋放將快很多。

    • 例如:

5. CPU 運行的原理

  • PC 上有很多程序“同時”進(jìn)行,看起來好像是 CPU “同時”處理所有程序似的,其實在同一時刻,單核的 CPU 只能運行一個程序,看起來“同時”運行的效果,實際上只是 CPU 在多個線程之間做快速切換的動作而已。

  • CPU 執(zhí)行哪個程序,或者說是哪個程序搶到了 CPU 的執(zhí)行權(quán),哪個程序就執(zhí)行,CPU 不會只執(zhí)行一個線程,執(zhí)行完一個后,會執(zhí)行另一個,或者說是另一個線程搶走了 CPU 的執(zhí)行權(quán)。至于如何執(zhí)行是由 CPU 所決定。

  • CPU 執(zhí)行哪個程序,是毫無規(guī)律的,這是多線程的特性:隨機(jī)性。

    二、創(chuàng)建方式

  • 創(chuàng)建線程的方式:繼承和實現(xiàn)。

1. 繼承

  • Java 中已經(jīng)提供了對線程描述的類 —— Thread。繼承 Thread 類,重寫(覆蓋)run 方法,創(chuàng)建線程。

  • 步驟:

    • 啟動線程,調(diào)用 run 方法。

    • 注:如果對象直接調(diào)用 run 方法,那么就只有一個線程在執(zhí)行,自定義的線程并沒有啟動。

    • 相當(dāng)于創(chuàng)建線程。

    • 自定義代碼存儲在 run 方法中,讓線程執(zhí)行。

    1. 定義類繼承 Thread;

    2. 重寫(覆蓋)Thread 中的 run 方法;

    3. 創(chuàng)建自定義類的實例對象;

    4. 實例對象調(diào)用線程的 start 方法。

  • 重寫(覆蓋)run 方法的原因:Thread 類用于描述線程,類中定義了一個功能,用于存儲線程要執(zhí)行的代碼,存儲這個功能的就是 run 方法。總而言之,Thread 中的 run 方法用于存儲線程要執(zhí)行的代碼。

  • 例如:java中怎么實現(xiàn)多線程

  • 結(jié)果如下

  • java中怎么實現(xiàn)多線程

  • 注:線程是隨機(jī)、交替執(zhí)行的,每次運行的結(jié)果都不同

2. 實現(xiàn)

  • 使用繼承 Thread 創(chuàng)建線程的方式有弊端,就是如果類繼承了其它的父類,就無法使用 Thread 來創(chuàng)建線程,于是便有了通過實現(xiàn) Runnable 接口來創(chuàng)建線程。實現(xiàn) Runnable 接口,重寫(覆蓋)run 方法,創(chuàng)建線程。

  • 步驟:

    • start 方法會自動調(diào)用 Runnable 子類的 run 方法。

    • 將 Runnable 的子類對象傳遞給 Thread 的構(gòu)造函數(shù)的原因:

    • 自定義的 run 方法所屬的對象是 Runnable 的子類對象,要讓線程去指定對象的 run 方法,就必須明確 run 方法所屬的對象。

    • 自定義代碼存儲在 run 方法中,讓線程執(zhí)行。

    1. 定義類實現(xiàn) Runnable;

    2. 重寫(覆蓋)Runnable 中的 run 方法;

    3. 通過 Thread 類創(chuàng)建線程對象。

    4. 將 Runnable 的子類對象作為實際參數(shù)傳遞給 Thread 的構(gòu)造函數(shù);

    5. 調(diào)用 Thread 中的 start 方法啟動線程。

  • 好處:避免了單繼承的局限性。(定義線程時,建議優(yōu)先使用)

  • 例如:

  • java中怎么實現(xiàn)多線程

  • 結(jié)果如下:

  • java中怎么實現(xiàn)多線程

  • 注:線程是隨機(jī)、交替執(zhí)行的,每次運行的結(jié)果都不同。

三、區(qū)別及狀態(tài)

1. 創(chuàng)建方式的區(qū)別

  • 繼承:線程代碼存儲在 Thread 子類的 run 方法中。

  • 實現(xiàn):線程代碼存儲在 Runnable 子類的 run 方法中。

2. 狀態(tài)

  • 被創(chuàng)建:等待啟動,調(diào)用 start 啟動。

  • 運行狀態(tài):具有執(zhí)行資格和執(zhí)行權(quán)。

  • 臨時狀態(tài)(阻塞):具有執(zhí)行資格,但沒有執(zhí)行權(quán)。

  • 凍結(jié)狀態(tài):遇到 sleep(time) 方法和 wait() 方法時,失去執(zhí)行資格和執(zhí)行權(quán);sleep 方法的時間結(jié)束或調(diào)用 notify() 方法時,獲得執(zhí)行資格,變?yōu)榕R時狀態(tài)(阻塞)。

  • 消亡狀態(tài):調(diào)用 stop() 方法或 run 方法結(jié)束。

    • 注:線程從創(chuàng)建狀態(tài)到了運行狀態(tài)后,再次調(diào)用 start() 方法時,已經(jīng)沒有任何意義,Java 運行時會提示線程狀態(tài)異常。

    •  

 java中怎么實現(xiàn)多線程

四、安全問題

1. 原因

  • 當(dāng)多條語句操作同一個線程的共享數(shù)據(jù)時,一個線程對多條語句只執(zhí)行了一部分,沒執(zhí)行完成時,另外的線程參與執(zhí)行,會導(dǎo)致共享數(shù)據(jù)的錯誤異常,也就是線程的安全問題。

  • 總而言之:

    1. 線程的隨機(jī)性。

    2. 多個線程訪問出現(xiàn)延遲。

  • 注:線程的安全問題在理想狀態(tài)下,一般不容易出現(xiàn),但是一旦出現(xiàn)線程的安全問題,將會對程序軟件造成非常大的影響。

2. 同步

  • 對于線程的安全問題,在對多條操作共享數(shù)據(jù)的語句時,只讓一個線程執(zhí)行完,再讓下個線程去執(zhí)行,每條線程在執(zhí)行的過程中,其它線程都不可以參與執(zhí)行。

  • Java 中提供了專業(yè)的解決辦法 —— synchronized(同步)。

  • 解決的方式:同步代碼塊和同步函數(shù)。(均是使用關(guān)鍵字 synchronized 實現(xiàn))

    • 格式:

      synchronized(對象){ 
          需要被同步的代碼;
       }

    • 同步之所以可以解決線程的安全問題,根本原因在于對象上,對象如果加了同步鎖,持有鎖的線程可以在同步中執(zhí)行,沒持有鎖的線程即使獲取 CPU 的執(zhí)行權(quán),也無法進(jìn)入去執(zhí)行,因為沒有獲取到同步鎖。

    • 例如:

    1. 同步代碼塊

java中怎么實現(xiàn)多線程

  • 前提:

    1. 必須有兩個或以上的線程;

    2. 必須是多個線程使用同一個鎖。

  • 利與弊:

    • 利:解決了多線程的安全問題。

    • 弊:多個線程均需要判斷鎖,消耗資源,影響效率。

  • 如何尋找多線程的安全問題?

    1. 明確共享數(shù)據(jù);

    2. 明確哪些代碼是多線程運行的代碼;

    3. 明確多線程運行的代碼中哪些語句是操作共享數(shù)據(jù)的。

3. 靜態(tài)函數(shù)的同步

  • 同步函數(shù)被靜態(tài)所修飾后,使用的同步鎖不再是 this,因為靜態(tài)函數(shù)中不可以定義 this,靜態(tài)進(jìn)入內(nèi)存時,內(nèi)存中沒有本類對象,但一定存在類所對應(yīng)的字節(jié)碼文件對象。

    • 例如:類名.class(對象的類型是 Class)

  • 靜態(tài)函數(shù)所使用的同步鎖就是所在類的字節(jié)碼文件對象。

    • 類名.class

  • 例如:

 java中怎么實現(xiàn)多線程

4. 死鎖

  • 同步中嵌套同步時,有可能出現(xiàn)死鎖現(xiàn)象。

  • 例如:

 java中怎么實現(xiàn)多線程

說明:程序卡死,無法繼續(xù)執(zhí)行。

五、通信

  • 多個線程操作同一個資源,但是操作的動作不相同,就是線程間通信。

  • 同步操作同一個資源

    • 例如:

 java中怎么實現(xiàn)多線程

  • 問題點:

    • 需要喚醒對方線程時,如果只用 notify(),容易出現(xiàn)只喚醒本方線程的情況,會導(dǎo)致程序中所有線程都處于等待狀態(tài)。

    • wait():釋放 CPU 的執(zhí)行權(quán),釋放同步鎖。

    • sleep():釋放 CPU 的執(zhí)行權(quán),不釋放同步鎖。

    • 例如:同一個鎖上 wait 的線程,只能被同一個鎖上的 notify 喚醒。

    1. 這些方法存在于同步中;

    2. 使用這些方法時必須要有標(biāo)識所屬的同步鎖;

    3. 鎖可以是任意的對象,任意對象調(diào)用的方法一定要定義在 Object 類中。

    1. wait()、notify()、notifyAll() 用來操作線程的,為什么是定義在 Object 類中呢?

    2. wait() 和 sleep() 有什么區(qū)別呢?

    3. 為什么要定義 notifyAll()?

JDK 5 及以上版本中提供了多線程同步鎖的升級解決方案

  • 將 synchronized(同步)替換成 Lock,將 Object 類中的 wait()、notify()、notifyAll() 替換成 Condition 對象。

  • Condition 對象可通過 Lock(鎖)進(jìn)行獲取,并且支持多個相關(guān)的 Condition 對象。

  • 例如:

  •  

 java中怎么實現(xiàn)多線程

java中怎么實現(xiàn)多線程

  • 說明:只要在主函數(shù)或者其它線程中,對標(biāo)記 flag 賦值 false,就可以讓 run() 方法結(jié)束,線程停止。

特殊情況:當(dāng)線程處于凍結(jié)狀態(tài)時,無法讀取到 run() 方法中的代碼,線程就無法停止。

  • 需要對線程的凍結(jié)狀態(tài)進(jìn)行清除,強(qiáng)制讓線程恢復(fù)運行,Thread 類中提供了 interrupt();

  • 例如:

java中怎么實現(xiàn)多線程 

java中怎么實現(xiàn)多線程

七、什么情況需要多線程?

  • 某些代碼需要同時執(zhí)行時,可用單獨的線程封裝,多線程運行執(zhí)行。

  • 例如

java中怎么實現(xiàn)多線程

八、拓展

  • join();

    • 當(dāng) A 線程執(zhí)行到了 B 線程的 join(); 方法時,A 線程等待,B 線程執(zhí)行完后,A 線程才繼續(xù)執(zhí)行(此時的 B 線程與其它線程交替執(zhí)行)。

    • 臨時加入線程去執(zhí)行:

  • setPriority();

    • MIN_PRIORITY:最低優(yōu)先級 1

    • MAX_PRIORITY:最高優(yōu)先級 10

    • NORM_PRIORITY:默認(rèn)優(yōu)先級

    • 設(shè)置優(yōu)先級:

  • yield();

    • 可以暫停當(dāng)前線程,讓其它線程執(zhí)行。

關(guān)于java中怎么實現(xiàn)多線程 問題的解答就分享到這里了,希望以上內(nèi)容可以對大家有一定的幫助,如果你還有很多疑惑沒有解開,可以關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道了解更多相關(guān)知識。

網(wǎng)頁名稱:java中怎么實現(xiàn)多線程
鏈接URL:http://m.rwnh.cn/article28/iggpjp.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供品牌網(wǎng)站制作、外貿(mào)網(wǎng)站建設(shè)網(wǎng)站排名、網(wǎng)站改版網(wǎng)站營銷、網(wǎng)站制作

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)

網(wǎng)站建設(shè)網(wǎng)站維護(hù)公司
兴安县| 峨边| 绵阳市| 开江县| 秀山| 芮城县| 忻州市| 五常市| 桐梓县| 庆云县| 从化市| 武威市| 同心县| 嘉义县| 陆良县| 广昌县| 闽侯县| 文安县| 延川县| 光泽县| 淅川县| 神池县| 乌海市| 江陵县| 吉木萨尔县| 昆山市| 崇文区| 虞城县| 东乡族自治县| 井陉县| 扶沟县| 凭祥市| 庆云县| 惠水县| 浮梁县| 武威市| 腾冲县| 郎溪县| 宜君县| 长泰县| 嘉善县|