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

Java線程模型缺陷研究[2]

2013-11-23 19:56:03  來源: Java高級技術 

    task(任務)的概念

    Java 線程模型的根本問題是它完全不是面向對象的面向對象 (OO) 設計人員根本不按線程角度考慮問題他們考慮的是同步 信息 異步 信息(同步信息被立即處理 直到信息處理完成才返回消息句柄異步信息收到後將在後台處理一段時間 而早在信息處理結束前就返回消息句柄)Java 編程語言中的 ToolkitgetImage() 方法就是異步信息的一個好例子 getImage() 的消息句柄將被立即返回而不必等到整個圖像被後台線程取回

    這是面向對象 (OO) 的處理方法但是如前所述Java 的線程模型是非面向對象的一個 Java 編程語言線程實際上只是一個run() 過程它調用了其它的過程在這裡就根本沒有對象異步或同步信息以及其它概念

    對於此問題在我的書中深入討論過的一個解決方法是使用一個Active_object active 對象是可以接收異步請求的對象它在接收到請求後的一段時間內以後台方式得以處理在 Java 編程語言中一個請求可被封裝在一個對象中例如你可以把一個通過 Runnable 接口實現的實例傳送給此 active 對象該接口的 run() 方法封裝了需要完成的工作該 runnable 對象被此 active 對象排入到隊列中當輪到它執行時active 對象使用一個後台線程來執行它

    在一個 active 對象上運行的異步信息實際上是同步的因為它們被一個單一的服務線程按順序從隊列中取出並執行因此使用一個 active 對象以一種更為過程化的模型可以消除大多數的同步問題

    在某種意義上Java 編程語言的整個 Swing/AWT 子系統是一個 active 對象向一個 Swing 隊列傳送一條訊息的唯一安全的途徑是調用一個類似SwingUtilitiesinvokeLater() 的方法這樣就在 Swing 事件隊列上發送了一個 runnable 對象當輪到它執行時 Swing 事件處理線程將會處理它

    那麼我的第一個建議是向 Java 編程語言中加入一個task (任務)的概念從而將active 對象集成到語言中( task的概念是從 Intel 的 RMX 操作系統和 Ada 編程語言借鑒過來的大多數實時操作系統都支持類似的概念

    一個任務有一個內置的 active 對象分發程序並自動管理那些處理異步信息的全部機制

    定義一個任務和定義一個類基本相同不同的只是需要在任務的方法前加一個asynchronous 修飾符來指示 active 對象的分配程序在後台處理這些方法

    所有的寫請求都用一個dispatch() 過程調用被放在 activeobject 的輸入隊列中排隊在後台處理這些異步信息時出現的任何異常 (exception) 都由 Exception_handler 對象處理此 Exception_handler 對象被傳送到 File_io_task 的構造函數中

    這種基於類的處理方法其主要問題是太復雜了 對於一個這樣簡單的操作代碼太雜了

[]  []  []  []  []  []  []  


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