欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

剖析Java中線程編程的概念

 更新時間:2015年09月28日 18:18:08   投稿:goldensun  
這篇文章主要介紹了Java中線程編程的概念,是Java入門學習中的基礎知識,需要的朋友可以參考下

Java線程的概念
和其他多數計算機語言不同,Java內置支持多線程編程(multithreaded programming)。

多線程程序包含兩條或兩條以上并發(fā)運行的部分。程序中每個這樣的部分都叫一個線程(thread),每個線程都有獨立的執(zhí)行路徑。因此,多線程是多任務處理的一種特殊形式。

你一定知道多任務處理,因為它實際上被所有的現代操作系統所支持。然而,多任務處理有兩種截然不同的類型:基于進程的和基于線程的。認識兩者的不同是十分重要的。

對很多讀者,基于進程的多任務處理是更熟悉的形式。進程(process)本質上是一個執(zhí)行的程序。因此,基于進程(process-based) 的多任務處理的特點是允許你的計算機同時運行兩個或更多的程序。舉例來說,基于進程的多任務處理使你在運用文本編輯器的時候可以同時運行Java編譯器。在基于進程的多任務處理中,程序是調度程序所分派的最小代碼單位。

在基于線程(thread-based) 的多任務處理環(huán)境中,線程是最小的執(zhí)行單位。這意味著一個程序可以同時執(zhí)行兩個或者多個任務的功能。例如,一個文本編輯器可以在打印的同時格式化文本。所以,多進程程序處理“大圖片”,而多線程程序處理細節(jié)問題。

多線程程序比多進程程序需要更少的管理費用。進程是重量級的任務,需要分配它們自己獨立的地址空間。進程間通信是昂貴和受限的。進程間的轉換也是很需要花費的。另一方面,線程是輕量級的選手。它們共享相同的地址空間并且共同分享同一個進程。線程間通信是便宜的,線程間的轉換也是低成本的。當Java程序使用多進程任務處理環(huán)境時,多進程程序不受Java的控制,而多線程則受Java控制。

多線程幫助你寫出CPU最大利用率的高效程序,因為空閑時間保持最低。這對Java運行的交互式的網絡互連環(huán)境是至關重要的,因為空閑時間是公共的。舉個例子來說,網絡的數據傳輸速率遠低于計算機處理能力,本地文件系統資源的讀寫速度遠低于CPU的處理能力,當然,用戶輸入也比計算機慢很多。在傳統的單線程環(huán)境中,你的程序必須等待每一個這樣的任務完成以后才能執(zhí)行下一步——盡管CPU有很多空閑時間。多線程使你能夠獲得并充分利用這些空閑時間。

Java線程模型
Java運行系統在很多方面依賴于線程,所有的類庫設計都考慮到多線程。實際上,Java使用線程來使整個環(huán)境異步。這有利于通過防止CPU循環(huán)的浪費來減少無效部分。

為更好的理解多線程環(huán)境的優(yōu)勢可以將它與它的對照物相比較。單線程系統的處理途徑是使用一種叫作輪詢的事件循環(huán)方法。在該模型中,單線程控制在一無限循環(huán)中運行,輪詢一個事件序列來決定下一步做什么。一旦輪詢裝置返回信號表明,已準備好讀取網絡文件,事件循環(huán)調度控制管理到適當的事件處理程序。直到事件處理程序返回,系統中沒有其他事件發(fā)生。這就浪費了CPU時間。這導致了程序的一部分獨占了系統,阻止了其他事件的執(zhí)行??偟膩碚f,單線程環(huán)境,當一個線程因為等待資源時阻塞(block,掛起執(zhí)行),整個程序停止運行。

Java多線程的優(yōu)點在于取消了主循環(huán)/輪詢機制。一個線程可以暫停而不影響程序的其他部分。例如,當一個線程從網絡讀取數據或等待用戶輸入時產生的空閑時間可以被利用到其他地方。多線程允許活的循環(huán)在每一幀間隙中沉睡一秒而不暫停整個系統。在Java程序中出現線程阻塞,僅有一個線程暫停,其他線程繼續(xù)運行。

線程存在于好幾種狀態(tài)。線程可以正在運行(running)。只要獲得CPU時間它就可以運行。運行的線程可以被掛起(suspend),并臨時中斷它的執(zhí)行。一個掛起的線程可以被恢復(resume,允許它從停止的地方繼續(xù)運行。一個線程可以在等待資源時被阻塞(block)。

在任何時候,線程可以終止(terminate),這立即中斷了它的運行。一旦終止,線程不能被恢復。
線程優(yōu)先級

Java給每個線程安排優(yōu)先級以決定與其他線程比較時該如何對待該線程。線程優(yōu)先級是詳細說明線程間優(yōu)先關系的整數。作為絕對值,優(yōu)先級是毫無意義的;當只有一個線程時,優(yōu)先級高的線程并不比優(yōu)先權低的線程運行的快。相反,線程的優(yōu)先級是用來決定何時從一個運行的線程切換到另一個。這叫“上下文轉換”(context switch)。決定上下文轉換發(fā)生的規(guī)則很簡單:
線程可以自動放棄控制。在I/O未決定的情況下,睡眠或阻塞由明確的讓步來完成。在這種假定下,所有其他的線程被檢測,準備運行的最高優(yōu)先級線程被授予CPU。
線程可以被高優(yōu)先級的線程搶占。在這種情況下,低優(yōu)先級線程不主動放棄,處理器只是被先占——無論它正在干什么——處理器被高優(yōu)先級的線程占據?;旧?,一旦高優(yōu)先級線程要運行,它就執(zhí)行。這叫做有優(yōu)先權的多任務處理。

當兩個相同優(yōu)先級的線程競爭CPU周期時,情形有一點復雜。對于Windows98這樣的操作系統,等優(yōu)先級的線程是在循環(huán)模式下自動劃分時間的。對于其他操作系統,例如Solaris 2.x,等優(yōu)先級線程相對于它們的對等體自動放棄。如果不這樣,其他的線程就不會運行。

警告:不同的操作系統下等優(yōu)先級線程的上下文轉換可能會產生錯誤。
同步性

因為多線程在你的程序中引入了一個異步行為,所以在你需要的時候必須有加強同步性的方法。舉例來說,如果你希望兩個線程相互通信并共享一個復雜的數據結構,例如鏈表序列,你需要某些方法來確保它們沒有相互沖突。也就是說,你必須防止一個線程寫入數據而另一個線程正在讀取鏈表中的數據。為此目的,Java在進程間同步性的老模式基礎上實行了另一種方法:管程(monitor)。管程是一種由C.A.R.Hoare首先定義的控制機制。

你可以把管程想象成一個僅控制一個線程的小盒子。一旦線程進入管程,所有線程必須等待直到該線程退出了管程。用這種方法,管程可以用來防止共享的資源被多個線程操縱。

很多多線程系統把管程作為程序必須明確的引用和操作的對象。Java提供一個清晰的解決方案。沒有“Monitor”類;相反,每個對象都擁有自己的隱式管程,當對象的同步方法被調用時管程自動載入。一旦一個線程包含在一個同步方法中,沒有其他線程可以調用相同對象的同步方法。這就使你可以編寫非常清晰和簡潔的多線程代碼,因為同步支持是語言內置的。
消息傳遞

在你把程序分成若干線程后,你就要定義各線程之間的聯系。用大多數其他語言規(guī)劃時,你必須依賴于操作系統來確立線程間通信。這樣當然增加花費。然而,Java提供了多線程間談話清潔的、低成本的途徑——通過調用所有對象都有的預先確定的方法。Java的消息傳遞系統允許一個線程進入一個對象的一個同步方法,然后在那里等待,直到其他線程明確通知它出來。
Thread 類和Runnable 接口

Java的多線程系統建立于Thread類,它的方法,它的共伴接口Runnable基礎上。Thread類封裝了線程的執(zhí)行。既然你不能直接引用運行著的線程的狀態(tài),你要通過它的代理處理它,于是Thread 實例產生了。為創(chuàng)建一個新的線程,你的程序必須擴展Thread 或實現Runnable接口。

Thread類定義了好幾種方法來幫助管理線程。本章用到的方法如表所示:

相關文章

  • 淺談Java鎖的膨脹過程以及一致性哈希對鎖膨脹的影響

    淺談Java鎖的膨脹過程以及一致性哈希對鎖膨脹的影響

    本文主要介紹了Java鎖的膨脹過程以及一致性哈希對鎖膨脹的影響,文中通過示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2022-02-02
  • Java登錄功能實現token生成與驗證

    Java登錄功能實現token生成與驗證

    這篇文章介紹了Java登錄功能實現token生成與驗證,文中通過示例代碼介紹的非常詳細。對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2021-12-12
  • SpringBoot disruptor高性能隊列使用

    SpringBoot disruptor高性能隊列使用

    這篇文章主要介紹了SpringBoot disruptor高性能隊列使用,Disruptor是英國外匯交易公司LMAX開發(fā)的一個高性能隊列,研發(fā)的初衷是解決內存隊列的延遲問題
    2023-02-02
  • springboot中設置定時任務的三種方法小結

    springboot中設置定時任務的三種方法小結

    在我們開發(fā)項目過程中,經常需要定時任務來幫助我們來做一些內容,本文介紹了springboot中設置定時任務的三種方法,主要包括@Scheduled注解,Quartz框架和xxl-job框架的實現,感興趣的可以了解一下
    2023-12-12
  • java中關于轉義字符的一個bug

    java中關于轉義字符的一個bug

    本文主要介紹了java中關于轉義字符的一個bug。具有很好的參考價值,下面跟著小編一起來看下吧
    2017-02-02
  • SpringCloud學習筆記之OpenFeign進行服務調用

    SpringCloud學習筆記之OpenFeign進行服務調用

    OpenFeign對feign進行進一步的封裝,添加了springmvc的一些功能,更加強大,下面這篇文章主要給大家介紹了關于SpringCloud學習筆記之OpenFeign進行服務調用的相關資料,需要的朋友可以參考下
    2022-01-01
  • RPC框架之Thrift的入門教程

    RPC框架之Thrift的入門教程

    Thrift是一個跨語言的服務部署框架,主要用于各個服務之間的RPC通信,支持跨語言,下面小編就來和大家講講Thrift框架的具體使用,希望對大家有所幫助
    2023-10-10
  • 解決MyBatis中為類配置別名,列名與屬性名不對應的問題

    解決MyBatis中為類配置別名,列名與屬性名不對應的問題

    這篇文章主要介紹了解決MyBatis中為類配置別名,列名與屬性名不對應的問題,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2020-11-11
  • Java配置DBeaver的詳細步驟

    Java配置DBeaver的詳細步驟

    DBeaver是一個集成的數據庫客戶端工具,需要java語言支持,所以安裝之前需要配置JDK環(huán)境,這篇文章主要介紹了Java配置DBeaver的詳細步驟,需要的朋友可以參考下
    2021-03-03
  • 詳解Java分布式系統中一致性哈希算法

    詳解Java分布式系統中一致性哈希算法

    這篇文章主要介紹了Java分布式系統中一致性哈希算法,對算法感興趣的同學,可以參考下
    2021-04-04

最新評論