java多線程編程,java多線程編程核心技術第二版pdf

本文目錄一覽:

java多線程編程中涉及的基礎知識點?

線程設計在軟體開發領域中是非常常見的一個設計構成,今天昆明北大青鳥就一起來了解一下,java多線程編程中都涉及到了哪些基礎知識點。

順序

用於表示多個操作「依次處理」。比如把十個操作交給一個人來處理時,這個人要一個一個地按順序來處理

並行

用於標識多個操作「同時處理」。比如十個操作分給兩個人處理時,這兩個人就會並行來處理。

並發

相對於順序和並行來說比較抽象,用於表示「將一個操作分割成多個部分並且允許無序處理」。比如將十個操作分成相對獨立的兩類,這樣便能夠開始並發處理了。如果一個人來處理,這個人就是順序處理分開的並發操作,而如果是兩個人,這兩個人就可以並行處理同一個操作。

總結

多線程程序都是並發處理的。如果CPU只有一個,那麼並發處理就是順序執行的,而如果有多個CPU,那麼並發處理就可能會並行運行。

等待隊列

所有實例都擁有一個等待隊列,它是在實例的wait方法執行後停止操作的線程隊列。就好比為每個實例準備的線程休息室

在執行wait方法後,線程便會暫停操作,進入等待隊列這個休息室。除非發生下列某一情況,否則線程會一直在等待隊列中休眠。

有其他線程的notify方法來喚醒線程

有其他線程的notifyAll方法來喚醒線程

有其他線程的interrupt方法來喚醒線程

wait方法超時

notify方法

該方法會將等待隊列中的一個線程去除。同wait方法一樣,若要執行notify方法,線程也必須持有要調用的實例的鎖。

notifyAll方法

notify方法僅喚醒一個線程,而notifyAll則喚醒所有線程,這是兩者之間的區別

同wait方法和notify方法一樣,notifyAll方法也只能由持有要調用的實例鎖的線程調用

notify和notifyAll選擇

notify方法和notifyAll方法非常相似,到底該使用哪個?

實際上,這很難選擇,由於notify喚醒的線程較少,所以處理速度要比使用notifyAll時快。但使用notify時,如果處理不好,程序便可能會停止。一般來說,使用notifyAll時的代碼要比使用notify時的更為健壯。

Java多線程編程基礎之線程和多線程

隨著計算機技術的發展 編程模型也越來越複雜多樣化 但多線程編程模型是目前計算機系統架構的最終模型 隨著CPU主頻的不斷攀升 X 架構的硬體已經成為瓶 在這種架構的CPU主頻最高為 G 事實上目前 G主頻的CPU已經接近了頂峰

如果不能從根本上更新當前CPU的架構(在很長一段時間內還不太可能) 那麼繼續提高CPU性能的方法就是超線程CPU模式 那麼 作業系統 應用程序要發揮CPU的最大性能 就是要改變到以多線程編程模型為主的並行處理系統和並髮式應用程序

所以 掌握多線程編程模型 不僅是目前提高應用性能的手段 更是下一代編程模型的核心思想 多線程編程的目的 就是 最大限度地利用CPU資源 當某一線程的處理不需要佔用CPU而只和I/O OEMBIOS等資源打交道時 讓需要佔用CPU資源的其它線程有機會獲得CPU資源 從根本上說 這就是多線程編程的最終目的

第一需要弄清的問題

如同程序和進程的區別 要掌握多線程編程 第一要弄清的問題是 線程對象和線程的區別

線程對象是可以產生線程的對象 比如在java平台中Thread對象 Runnable對象 線程 是指正在執行的一個指點令序列 在java平台上是指從一個線程對象的start()開始 運行run方法體中的那一段相對獨立的過程

鑒於作者的水平 無法用更確切的辭彙來描述它們的定義 但這兩個有本質區別的概念請初學者細細體會 隨著介紹的深入和常式分析的增加 就會慢慢明白它們所代表的真實含義

天下難事必始於易 天下大事必始於細

讓我們先從最簡單的 單線程 來入手 ( )帶引號說明只是相對而言的單線程 ( )基於java

class BeginClass{ public static void main(String[] args){ for(int i= ;i ;i++) System out println( Hello World! ); } }

如果我們成功編譯了該java文件 然後在命令行上敲入

java BeginClass

現在發生了什麼呢?每一個java程序員 從他開始學習java的第一分鐘里都會接觸到這個問題 但是 你知道它到底發生髮什麼?

JVM進程被啟動 在同一個JVM進程中 有且只有一個進程 就是它自己 然後在這個JVM環境中 所有程序的運行都是以線程來運行 JVM最先會產生一個主線程 由它來運行指定程序的入口點 在這個程序中 就是主線程從main方法開始運行 當main方法結束後 主線程運行完成 JVM進程也隨之退出

我們看到的是一個主線程在運行main方法 這樣的只有一個線程執行程序邏輯的流程我們稱

之為單線程 這是JVM提供給我們的單線程環境 事實上 JVM底層還至少有垃圾回收這樣的後台線程以及其它非java線程 但這些線程對我們而言不可訪問 我們只認為它是單線程的

主線程是JVM自己啟動的 在這裡它不是從線程對象產生的 在這個線程中 它運行了main方法這個指令序列 理解它 但它沒有更多可以研究的內容

接觸多線程

class MyThread extends Thread{ public void run(){ System out println( Thread say:Hello World! ); } } public class MoreThreads{ public static void main(String[] args){ new MyThread(); new MyThread() start(); System out println( Main say:Hello World ); } }

執行這個程序 main方法第一行產生了一個線程對象 但並沒有線程啟動

main方法第二行產生了一個線程對象 並啟動了一個線程

main方法第三行 產生並啟動一個線程後 主線程自己也繼續執行其它語句

lishixinzhi/Article/program/Java/gj/201311/27552

什麼是Java多線程編程?

一、 什麼是多線程:

我們現在所使用操作系統都是多任務操作系統(早期使用的DOS操作系統為單任務操作系統),多任務操作指在同一時刻可以同時做多件事(可以同時執行多個程序)。

多進程:每個程序都是一個進程,在操作系統中可以同時執行多個程序,多進程的目的是為了有效的使用CPU資源,每開一個進程系統要為該進程分配相關的系統資源(內存資源)

多線程:線程是進程內部比進程更小的執行單元(執行流|程序片段),每個線程完成一個任務,每個進程內部包含了多個線程每個線程做自己的事情,在進程中的所有線程共享該進程的資源;

主線程:在進程中至少存在一個主線程,其他子線程都由主線程開啟,主線程不一定在其他線程結束後結束,有可能在其他線程結束前結束。Java中的主線程是main線程,是Java的main函數;

二、 Java中實現多線程的方式:

繼承Thread類來實現多線程:

當我們自定義的類繼承Thread類後,該類就為一個線程類,該類為一個獨立的執行單元,線程代碼必須編寫在run()方法中,run方法是由Thread類定義,我們自己寫的線程類必須重寫run方法。

run方法中定義的代碼為線程代碼,但run方法不能直接調用,如果直接調用並沒有開啟新的線程而是將run方法交給調用的線程執行

要開啟新的線程需要調用Thread類的start()方法,該方法自動開啟一個新的線程並自動執行run方法中的內容

請點擊輸入圖片描述

結果:

請點擊輸入圖片描述

java多線程的啟動順序不一定是線程執行的順序,各個線程之間是搶佔CPU資源執行的,所有有可能出現與啟動順序不一致的情況。

CPU的調用策略:

如何使用CPU資源是由操作系統來決定的,但操作系統只能決定CPU的使用策略不能控制實際獲得CPU執行權的程序。

線程執行有兩種方式:

1.搶佔式:

目前PC機中使用最多的一種方式,線程搶佔CPU的執行權,當一個線程搶到CPU的資源後並不是一直執行到此線程執行結束,而是執行一個時間片後讓出CPU資源,此時同其他線程再次搶佔CPU資源獲得執行權。

2.輪循式;

每個線程執行固定的時間片後讓出CPU資源,以此循環執行每個線程執行相同的時間片後讓出CPU資源交給下一個線程執行。

希望對您有所幫助!~

原創文章,作者:小藍,如若轉載,請註明出處:https://www.506064.com/zh-tw/n/192788.html

(0)
打賞 微信掃一掃 微信掃一掃 支付寶掃一掃 支付寶掃一掃
小藍的頭像小藍
上一篇 2024-12-01 10:29
下一篇 2024-12-01 10:30

相關推薦

  • Java JsonPath 效率優化指南

    本篇文章將深入探討Java JsonPath的效率問題,並提供一些優化方案。 一、JsonPath 簡介 JsonPath是一個可用於從JSON數據中獲取信息的庫。它提供了一種DS…

    編程 2025-04-29
  • java client.getacsresponse 編譯報錯解決方法

    java client.getacsresponse 編譯報錯是Java編程過程中常見的錯誤,常見的原因是代碼的語法錯誤、類庫依賴問題和編譯環境的配置問題。下面將從多個方面進行分析…

    編程 2025-04-29
  • Java騰訊雲音視頻對接

    本文旨在從多個方面詳細闡述Java騰訊雲音視頻對接,提供完整的代碼示例。 一、騰訊雲音視頻介紹 騰訊雲音視頻服務(Cloud Tencent Real-Time Communica…

    編程 2025-04-29
  • Java Bean載入過程

    Java Bean載入過程涉及到類載入器、反射機制和Java虛擬機的執行過程。在本文中,將從這三個方面詳細闡述Java Bean載入的過程。 一、類載入器 類載入器是Java虛擬機…

    編程 2025-04-29
  • Java Milvus SearchParam withoutFields用法介紹

    本文將詳細介紹Java Milvus SearchParam withoutFields的相關知識和用法。 一、什麼是Java Milvus SearchParam without…

    編程 2025-04-29
  • Python基礎教程第三版PDF下載

    熟練掌握Python編程語言可以讓你輕鬆地用代碼解決很多問題,Python基礎教程第三版是一本適合初學者的Python教程。本文將從幾個方面詳細介紹Python基礎教程第三版PDF…

    編程 2025-04-29
  • Java 8中某一周的周一

    Java 8是Java語言中的一個版本,於2014年3月18日發布。本文將從多個方面對Java 8中某一周的周一進行詳細的闡述。 一、數組處理 Java 8新特性之一是Stream…

    編程 2025-04-29
  • Java判斷字元串是否存在多個

    本文將從以下幾個方面詳細闡述如何使用Java判斷一個字元串中是否存在多個指定字元: 一、字元串遍歷 字元串是Java編程中非常重要的一種數據類型。要判斷字元串中是否存在多個指定字元…

    編程 2025-04-29
  • VSCode為什麼無法運行Java

    解答:VSCode無法運行Java是因為默認情況下,VSCode並沒有集成Java運行環境,需要手動添加Java運行環境或安裝相關插件才能實現Java代碼的編寫、調試和運行。 一、…

    編程 2025-04-29
  • Java任務下發回滾系統的設計與實現

    本文將介紹一個Java任務下發回滾系統的設計與實現。該系統可以用於執行複雜的任務,包括可回滾的任務,及時恢復任務失敗前的狀態。系統使用Java語言進行開發,可以支持多種類型的任務。…

    編程 2025-04-29

發表回復

登錄後才能評論