国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 學院 > 開發設計 > 正文

關于解決 Java 編程語言線程問題的建議

2019-11-18 10:47:11
字體:
來源:轉載
供稿:網友

  java 編程語言的線程模型可能是此語言中最薄弱的部分。它完全不適合實際復雜程序的要求,而且也完全不是面向對象的。本文建議對 Java 語言進行重大修改和補充,以解決這些問題。
  
  Java 語言的線程模型是此語言的一個最難另人滿足的部分。盡管 Java 語言本身就支持線程編程是件好事,但是它對線程的語法和類包的支持太少,只能適用于極小型的應用環境。
  
  關于 Java 線程編程的大多數書籍都長篇累牘地指出了 Java 線程模型的缺陷,并提供了解決這些問題的急救包(Band-Aid/邦迪創可貼)類庫。我稱這些類為急救包,是因為它們所能解決的問題本應是由Java 語言本身語法所包含的。從長遠來看,以語法而不是類庫方法,將能產生更高效的代碼。這是因為編譯器和Java 虛擬器 (JVM) 能一同優化程序代碼,而這些優化對于類庫中的代碼是很難或無法實現的。
  
  Java 編程語言本身進行一些修改,以使得它能夠真正解決這些線程編程的問題。本文和我這本書的主要區別是,我在撰寫本文時進行了更多的思考,所以對書中的提議加以了提高。這些建議只是嘗試性的 --只是我個人對這些問題的想法,而且實現這些想法需要進行大量的工作以及同行們的評價。但這是究竟是一個開端,我有意為解決這些問題成立一個專門的工作組,假如您感愛好,請發 e-mail 到 threading@holub.com。一旦我真正著手進行,我就會給您發通知。
  
  這里提出的建議是非常大膽的。有些人建議對 Java語言規范 (JLS)(請參閱參考資料)進行細微和少量的修改以解決當前模糊的JVM 行為,但是我卻想對其進行更為徹底的改進。
  
  在實際草稿中,我的許多建議包括為此語言引入新的要害字。雖然通常要求不要突破一個語言的現有代碼是正確的,但是假如該語言的并不是要保持不變以至于過時的話,它就必須能引入新的要害字。為了使引入的要害字與現有的標識符不產生沖突,經過細心考慮,我將使用一個($) 字符,而這個字符在現有的標識符中是非法的。(例如,使用$task, 而不是 task)。此時需要編譯器的命令行開關提供支持,能使用這些要害字的變體,而不是忽略這個美元符號。
  
  task(任務)的概念
  Java
  線程模型的根本問題是它完全不是面向對象的。面向對象 (OO) 設計人員根本不按線程角度考慮問題;他們考慮的是同步信息異步信息(同步信息被立即處理--直到信息處理完成才返回消息句柄;異步信息收到后將在后臺處理一段時-- 而早在信息處理結束前就返回消息句柄)。Java 編程語言中的Toolkit.getImage() 方法就是異步信息的一個好例子。getImage()的消息句柄將被立即返回,而不必等到整個圖像被后臺線程取回。
  
  這是面向對象 (OO) 的處理方法。但是,如前所述,Java的線程模型是非面向對象的。一個 Java 編程語言線程實際上只是一個
  
  run() 過程,它調用了其它的過程。在這里就根本沒有對象、異步或同步信息以及其它概念。對于此問題,在我的書中深入討論過的一個解決方法是,使用一個Active_object。 active對象是可以接收異步請求的對象,它在接收到請求后的一段時間內以后臺方式得以處理。在Java 編程語言中,一個請求可被封裝在一個對象中。例如,你可以把一個通過Runnable接口實現的實例傳送給此 active 對象,該接口的 run()方法封裝了需要完成的工作。該 runnable 對象被此 active 對象排入到隊列中,當輪到它執行時,active 對象使用一個后臺線程來執行它。
  
  在一個 active 對象上運行的異步信息實際上是同步的,因為它們被一個單一的服務線程按順序從隊列中取出并執行。因此,使用一個active 對象以一種更為過程化的模型可以消除大多數的同步問題。
  
  在某種意義上,Java 編程語言的整個 Swing/AWT 子系統是一個 active對象。向一個 Swing 隊列傳送一條訊息的唯一安全的途徑是,調用一個類似SwingUtilities.invokeLater() 的方法,這樣就在 Swing 事件隊列上發送了一個 runnable 對象,當輪到它執行時,Swing 事件處理線程將會處理它。
  
  那么我的第一個建議是,向 Java 編程語言中加入一個 task(任務)的概念,從而將active 對象集成到語言中。( task的概念是從 Intel 的 RMX操作系統和 Ada 編程語言借鑒過來的。大多數實時操作系統都支持類似的概念。)
  
  一個任務有一個內置的 active 對象分發程序,并自動治理那些處理異步信息的全部機制。
  
  定義一個任務和定義一個類基本相同,不同的只是需要在任務的方法前加一個asynchronous 修飾符來指示 active 對象的分配程序在后臺處理這些方法。請參考我的書中第九章的基于類方法,再看以下的 file_io 類,它使用了在《Taming Java Threads》中所討論的 Active_object類來實現異步寫操作:
  
    interface Exception_handler
    {  void handle_exception( Throwable e );
    }
  
    class File_io_task
    {  Active_object dispatcher = new Active_object();
  
      final OutputStream   file;
      final Exception_handler handler;
  
      File_io_task( String file_name, Exception_handler handler )
                          throws IOException
      {  file = new FileOutputStream( file_name );
        this.handler = handler;
      }
  
      public void write( final byte[] bytes )
      {
        // The following call asks the active-object dispatcher
        // to enqueue the Runnable object on its request
        // queue. A thread associated with the active object
        // dequeues the runnable objects and executes them
        // one at a time.
  
        dispatcher.dispatch
        (  new Runnable()
          {  public void run()
            {
              try
              {  byte[] copy new byte[ bytes.length ];
                System.arrayCopy(  bytes, 0,
                          copy,  0,
                          bytes.length );
                file.write( copy );
              }
              catch( Throwable PRoblem )
              {  handler.handle_exception( problem );
              }
            }
          }
        );
      }
    }
  所有的寫請求都用一個 dispatch() 過程調用被放在 active-object的輸入隊列中排隊。

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 长乐市| 绥宁县| 富顺县| 梁平县| 罗定市| 富源县| 岗巴县| 土默特右旗| 乳源| 贵定县| 大宁县| 宜兰市| 昆明市| 怀远县| 石家庄市| 吉首市| 彭州市| 临武县| 沙田区| 湖北省| 苏尼特左旗| 水富县| 盐池县| 雅江县| 苍梧县| 清新县| 抚远县| 河东区| 新源县| 随州市| 临洮县| 福建省| 景德镇市| 贵南县| 寿光市| 镇远县| 九龙城区| 托克托县| 桂东县| 凤台县| 浏阳市|