WEB开发网      濠电姷鏁告繛鈧繛浣冲洤纾瑰┑鐘宠壘閻ょ偓銇勯幇鍫曟闁稿鍠愰妵鍕冀閵娧佲偓鎺楁⒒閸曨偄顏柡宀嬬畱铻e〒姘煎灡绗戦梻浣筋嚙濮橈箓顢氳濠€浣糕攽閻樿宸ュΔ鐘叉啞缁傚秹宕滆绾惧ジ寮堕崼娑樺缂佹宀搁弻鐔风暋閻楀牆娈楅梺璇″枓閺呯姴鐣疯ぐ鎺濇晝闁靛牆妫欓蹇旂節閻㈤潧浠﹂柛銊ョ埣楠炴劙骞橀鑲╋紱闂佽宕樼粔顔裤亹閹烘挸浜归梺缁樺灦閿曗晛螞閸曨垱鈷戦柟鑲╁仜婵″ジ鎮楀☉鎺撴珖缂侇喖顑呴鍏煎緞濡粯娅囬梻浣瑰缁诲倿寮绘繝鍥ㄦ櫇闁稿本绋撻崢鐢告煟鎼淬垻鈯曢柨姘舵煟韫囥儳绋荤紒缁樼箖缁绘繈宕橀妸褌绱濋梻浣筋嚃閸ㄤ即宕弶鎴犳殾闁绘梻鈷堥弫鍌炴煕閳锯偓閺呮瑧妲愬Ο琛℃斀闁绘劕妯婇崵鐔封攽椤旇棄鍔ら摶鐐烘煕閺囥劌澧柛娆忕箻閺屽秹宕崟顒€娅g紓浣插亾濠㈣泛顑囩粻楣冩煙鐎涙ḿ绠橀柨娑樼У椤ㄣ儵鎮欓鍕紙闂佽鍠栫紞濠傜暦閹偊妲诲┑鈩冨絻椤兘寮诲☉銏犖╅柕澶堝労閸斿绱撴担绋库偓鍝ョ矓瑜版帒鏋侀柟鍓х帛閺呮悂鏌ㄩ悤鍌涘 ---闂傚倸鍊烽悞锔锯偓绗涘厾娲煛閸涱厾顔嗛梺璺ㄥ櫐閹凤拷
开发学院WEB开发Jsp 关于解决 Java 编程语言线程问题的建议 阅读

关于解决 Java 编程语言线程问题的建议

 2008-01-05 19:23:27 来源:WEB开发网 闂傚倸鍊风欢姘缚瑜嶈灋闁圭虎鍠栫粻顖炴煥閻曞倹瀚�闂傚倸鍊风粈渚€骞夐敓鐘插瀭闁汇垹鐏氬畷鏌ユ煙閹殿喖顣奸柛搴$У閵囧嫰骞掗幋婵冨亾閻㈢ǹ纾婚柟鐐灱濡插牊绻涢崱妤冃℃繛宀婁簽缁辨捇宕掑鎵佹瀸闂佺懓鍤栭幏锟�濠电姷鏁告慨顓㈠箯閸愵喖宸濇い鎾寸箘閹规洟姊绘笟鈧ḿ褍煤閵堝悿娲Ω閳轰胶鍔﹀銈嗗笂閼冲爼鍩婇弴銏$厪闁搞儮鏅涙禒褏绱掓潏鈺佷槐闁轰焦鎹囬弫鎾绘晸閿燂拷闂傚倸鍊风欢姘缚瑜嶈灋闁圭虎鍠栫粻顖炴煥閻曞倹瀚�  闂傚倸鍊烽懗鑸电仚缂備胶绮〃鍛村煝瀹ュ鍗抽柕蹇曞У閻庮剟姊虹紒妯哄妞ゆ劗鍘ч埥澶娢熼柨瀣偓濠氭⒑瑜版帒浜伴柛鎾寸☉閳绘柨顫濋懜纰樻嫼闂佸憡绋戦オ鏉戔枔閺冣偓缁绘稓浠﹂崒姘瀳闂佸磭绮幑鍥嵁鐎n亖鏀介柟閭﹀墯椤斿倹淇婇悙顏勨偓鏍ь潖婵犳艾鍌ㄧ憸蹇涘箟閹绢喗鏅搁柨鐕傛嫹
核心提示:java 编程语言的线程模型可能是此语言中最薄弱的部分,它完全不适合实际复杂程序的要求,关于解决 Java 编程语言线程问题的建议,而且也完全不是面向对象的,本文建议对 Java 语言进行重大修改和补充,请参考我的书中第九章的基于类方法,再看以下的 file_io 类,以解决这些问题,Java 语言的线程模型是此语言的

  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的输入队列中排队。

Tags:关于 解决 Java

编辑录入:爽爽 [复制链接] [打 印]
赞助商链接