當前位置 : IT培訓網 > Java開發 > Java教程 > Java線程模型重點知識解析

Java線程模型重點知識解析

時間:2016-08-29 17:53:19??來源:Java培訓網??作者:IT培訓網??已有:名學員訪問該課程
你必須防止一個線程寫入數據而另一個線程正在讀取鏈表中的數據。為此目的,Java在進程間同步性的老模式基礎上實行了另一種方法:管程(monitor)。管程是一種由C.A.R.Hoare首先定義的控制機制。

什么是Java線程模型,對于這個知識點我們又該如何學習,今天IT培訓網就來給大家詳細介紹下Java線程模型、優先級、同步性、消息傳遞等方面的知識點。

概念:

線程是一個程序內部的順序控制流

線程和進程的比較:

每個進程都有獨立的代碼和數據空間(進程上下文),進程切換的開銷大。

線程:輕量的進程,同一類線程共享代碼和數據空間,每個線程有獨立的運行棧和程序計數器(PC),線程切換的開銷小

多進程:在操作系統中能同時運行多個任務(程序)

多線程:在同一應用程序中有多個順序流同時執行。

Java線程模型

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

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

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

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

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

線程優先級

Java給每個線程安排優先級以決定與其他線程比較時該如何對待該線程。線程優先級是詳細說明線程間優先關系的整數。作為絕對值,優先級是毫無意義的;當只有一個線程時,優先級高的線程并不比優先權低的線程運行的快。相反,線程的優先級是用來決定何時從一個運行的線程切換到另一個。這叫“上下文轉換”(context switch)。決定上下文轉換發生的規則很簡單:

•       線程可以自動放棄控制。在I/O未決定的情況下,睡眠或阻塞由明確的讓步來完成。在這種假定下,所有其他的線程被檢測,準備運行的最高優先級線程被授予CPU。

•       線程可以被高優先級的線程搶占。在這種情況下,低優先級線程不主動放棄,處理器只是被先占——無論它正在干什么——處理器被高優先級的線程占據。基本上,一旦高優先級線程要運行,它就執行。這叫做有優先權的多任務處理。

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

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

同步性

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

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

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

消息傳遞

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

Thread 類和Runnable 接口

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

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

表 11-1 管理線程的方法

方法

意義

getName

獲得線程名稱

getPriority

獲得線程優先級

jsAlive

判定線程是否仍在運行

join

等待一個線程終止

run

線程的入口點.

sleep

在一段時間內掛起線程

start

通過調用運行方法來啟動線程

 

到目前為止,本書所應用的例子都是用單線程的。本章剩余部分解釋如何用Thread 和 Runnable 來創建、管理線程。讓我們從所有Java程序都有的線程:主線程開始。

頂一下
(0)
0%
踩一下
(0)
0%
------分隔線----------------------------
------分隔線----------------------------
Java教程
1、Java 概述
1.1 Java語言概述
1.2 Java虛擬機以及跨平臺原理
1.3 Java的主要就業方向
1.4 Java的不同版本
1.5 Java開發環境搭建
1.6 第一個Java程序示例
1.7 Java類和對象的概念
1.8 Java類庫及其組織結構
1.9 Java import
2、Java 語法基礎
2.1 Java數據類型以及變量的定義
2.2 Java數據類型轉換
2.3 Java運算符
2.4 Java流程控制
2.5 Java數組的定義和使用
2.6 Java字符串(String)
2.7 Java StringBuffer與StringBuider
2.8 強調一下編程風格
3、Java 類與對象
3.1 Java類的定義及其實例化
3.2 Java訪問修飾符
3.3 Java變量的作用域
3.4 Java this關鍵字詳解
3.5 Java方法重載
3.6 Java類的基本運行順序
3.7 Java包裝類、拆箱和裝箱詳解
3.8 再談Java包
3.9 源文件的聲明規則
4、Java 繼承和多態
4.1 繼承的概念與實現
4.2 Java super關鍵字
4.3 繼承中的方法的覆蓋和重載
4.4 多態和動態綁定
4.5 instanceof 運算符
4.6 多態對象的類型轉換
4.7 Java static關鍵字
4.8 Java final關鍵字
4.9 Java Object類
5、面向對象高級特性
5.1 Java內部類及其實例化
5.2 內部類的分類
5.3 抽象類的概念和使用
5.4 接口的概念和使用
5.5 接口和抽象類的區別
5.6 Java 泛型
5.7 泛型通配符和類型參數的范圍
6、異常處理
6.1 異常處理基礎
6.2 異常類型Java語言中常見的異常類型有哪些
6.3 未被捕獲的異常
6.4 try和catch的使用
6.5 多重catch語句的使用
6.6 try語句的嵌套
6.7 throw:異常的拋出
6.8 throws子句
6.9 finally塊
6.10 Java的內置異常
6.11 創建自己的異常子類
6.12 斷言
7、線程編程
7.1 線程的概念
7.2 Java線程模型
7.3 主線程
7.4 創建線程
7.5 創建多線程
7.6 isAlive()和join()的使用
7.7 線程優先級
7.8 線程同步
7.9 線程間通信
7.10 線程死鎖
7.11 線程的掛起、恢復和終止
8、輸入輸出(IO)操作
8.1 輸入輸出基本概念
8.2 面向字符的輸入流
8.3 面向字符的輸出流
8.4 面向字節的輸入輸出流
8.5 面向字節流的應用
8.6 文件與目錄管理
8.7 文件的隨機讀寫
8.8 文件的壓縮處理
9、常用類庫、向量與哈希
9.1 Java基礎類庫
9.2 Object類
9.3 Java語言包(java.lang)簡介
9.4 日期和時間類
9.5 向量及其應用
9.6 哈希表及其應用
10、圖形界面(GUI)設計
10.1 圖形界面設計基礎
10.2 框架窗口
10.3 標簽、按鈕和按鈕事件
10.4 面板
10.5 布局設計
10.6 文本框和文本區
10.7 文本框和文本區的輸入輸出
10.8 選擇框和單選按鈕
10.9 列表和組合框
10.10 菜單
10.11 對話框
10.12 滾動條
10.13 鼠標事件
10.14 鍵盤事件
11、圖形、圖像與多媒體
11.1 繪圖基礎
11.2 設置字型和顏色
11.3 繪圖模式
11.4 Graphics類的繪圖方法
11.5 Graphics2D類的繪圖方法
11.6 圖像處理基礎
11.7 圖像緩沖技術
11.8 多媒體基礎
12、網絡與數據庫編程
12.1 IP地址和InetAddress類
12.2 統一資源定位符
12.3 套接字(Socket)
12.4 數據庫連接
12.5 幾個重要的類和接口
12.6 數據庫查詢
12.7 數據庫更新
12.8 插入記錄
12.9 修改記錄
12.10 刪除記錄
激情色播