熱點推薦:
您现在的位置: 電腦知識網 >> 編程 >> Java編程 >> Java核心技術 >> 正文

Java進階 Java應用程序中動態分配CPU資源[2]

2013-11-23 19:38:59  來源: Java核心技術 

   Java的線程雖然在編程角度(API)是與平台無關的但它的運行效果卻和不同操作系統平台密切相關為了利用更多的CPU資源Java中的一個線程 (Thread)就對應著不同操作系統下的一個真實線程因為Java虛擬機沒有實現線程的調度所以這些Java的線程在不同操作系統調度下運行的差異性也就比較明顯例如在Windows系統中不僅線程的優先級少於Java API參數規定的十個優先級而且微軟明確反對程序員動態調整線程優先級即使在操作系統中有足夠的優先權讓線程優先級的參數和真實線程的優先級對應不同操作系統的調度方式也會有許多不同這最終會造成代碼在不同平台上的行為變得不可預測這就很難滿足復雜的大規模並發任務的眾多優先級需求從而很難達到用戶業務需要達到的效果

   由於在Java系統中線程被包裝在一個Java語言的對象類—Thread中所以為了完成Java語言對象和操作系統線程的對應Java線程的系統開銷還是比較大的(在NT 平均每個線程大致占用KB內存)因此如果讓Thread對象個數和成千上萬的任務數同比例增長就顯然是不合理的

  綜上所述根據並發多任務的大規模需求和Java平台固有的特點想要利用Java Thread對象的優先級調整CPU資源的分配是非常困難的所以應該盡量避免讓線程和任務直接對應也盡量避免使用操作系統線程優先級的調度機制

  解決方案

  根據以上分析問題的症結在於多任務系統中的任務在Java語言中的對應以及任務間的相互調度

  從本質上看一個任務就是一系列對象方法的調用序列與Java的Thread對象或者別的類的對象沒有必然聯系在避免使用不同操作系統線程調度且同時Java虛擬機又沒有線程調度能力的情況下要想構造一個協調式多任務系統讓各個任務相互配合就成了最直接的思路協調式多任務系統一般有以下特點

   任務由消息驅動消息的響應代碼完成任務邏輯的處理;

   消息隊列完成消息的存儲和管理從而利用消息處理的次序體現任務優先級的不同;

   任務中耗時的消息響應邏輯能夠主動放棄CPU資源讓別的任務執行(像Windows 中的Yield函數Visual Basic中的DoEvents語句)

  可能出於巧合Java語言具有構造協調式多任務系統天然的條件Java對象的方法不僅是一個函數調用它還是一個javalangreflectMethod類的對象而所有對象的方法都可以通過Method類的invoke 方法調用如果能使每個任務所對應的一系列方法全部以對象形式包裝成消息放到消息隊列中然後再按照自己的優先級算法將隊列中的消息取出執行其 Method對象的invoke調用那麼一個基本的協調式多任務系統就形成了其中任務的優先級和線程的優先級沒有綁定關系該系統的主體調度函數可以設置成一個死循環按照需要的優先級算法處理消息隊列對於有多重循環外設等待等耗時操作的消息響應函數可以在響應函數內部遞歸調用主體調度函數這一次調用把原來的死循環改成在消息隊列長度減少到一定程度(或者為空)後退出退出後函數返回執行剛才沒有完成的消息響應邏輯這樣就非常自然地實現了協調式系統中任務主動放棄CPU資源的要求

[]  []  []  


From:http://tw.wingwit.com/Article/program/Java/hx/201311/27235.html
    推薦文章
    Copyright © 2005-2013 電腦知識網 Computer Knowledge   All rights reserved.