⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 如果我是国王:关于解决 java 编程语言线程问题的建议.htm

📁 java的Java书籍JAVA多线程!请大家看看!!有学习的价值!!!xieixe
💻 HTM
📖 第 1 页 / 共 5 页
字号:
    -->
              <TBODY>
              <TR vAlign=bottom align=middle>
                <TD vAlign=bottom bgColor=#ffffff><A 
                  href="http://www-900.ibm.com/developerWorks/cn/java/j-king/index_eng.shtml" 
                  target=_blank><IMG height=20 alt=英文原文 
                  src="如果我是国王:关于解决 Java 编程语言线程问题的建议.files/src.jpg" width=86 
                  border=0></A> </TD></TR></TBODY></TABLE><!-- End PDF Download Table --><!-- TITLE and AUTHOR lines --><BR>
            <P><STRONG class=title>如果我是国王:关于解决 Java 编程语言线程问题的建议</STRONG><BR><!-- <strong class="subtitle">A proposal for fixing the Java programming language's threading problems</strong> --></P>
            <P>Allen Holub<BR>自由撰稿人<BR>2000 年 10 月</P><!-- END title and author lines --><!-- Begin Table of Contents-->
            <TABLE cellSpacing=0 cellPadding=0 width=120 align=right border=0>
              <TBODY>
              <TR>
                <TD align=middle bgColor=#cc6633><FONT 
                  face=helvetica,helv,arial color=#ffffff 
                  size=-1><B>内容:</B></FONT></TD></TR>
              <TR>
                <TD width="100%" bgColor=#000000><FONT 
                  face=helvetica,helv,arial size=-3><IMG height=1 alt="" 
                  src="如果我是国王:关于解决 Java 编程语言线程问题的建议.files/c.gif" width=1 
                  border=0></FONT></TD></TR>
              <TR>
                <TD width="100%" bgColor=#ffffff><FONT 
                  face=helvetica,helv,arial size=-3><IMG height=4 alt="" 
                  src="如果我是国王:关于解决 Java 编程语言线程问题的建议.files/c.gif" width=1 
                  border=0></FONT></TD></TR>
              <TR>
                <TD><A 
                  href="http://www-900.ibm.com/developerWorks/cn/java/j-king/index.shtml#1"><FONT 
                  face=helvetica,helv,arial size=-2>task(任务) 
的概念</FONT></A></TD></TR>
              <TR>
                <TD><A 
                  href="http://www-900.ibm.com/developerWorks/cn/java/j-king/index.shtml#2"><FONT 
                  face=helvetica,helv,arial size=-2>synchronized 
                关键字</FONT></A></TD></TR>
              <TR>
                <TD><A 
                  href="http://www-900.ibm.com/developerWorks/cn/java/j-king/index.shtml#3"><FONT 
                  face=helvetica,helv,arial size=-2>wait 和 notify 
                方法</FONT></A></TD></TR>
              <TR>
                <TD><A 
                  href="http://www-900.ibm.com/developerWorks/cn/java/j-king/index.shtml#4"><FONT 
                  face=helvetica,helv,arial size=-2>修定 thread 类</FONT></A></TD></TR>
              <TR>
                <TD><A 
                  href="http://www-900.ibm.com/developerWorks/cn/java/j-king/index.shtml#5"><FONT 
                  face=helvetica,helv,arial size=-2>线程间的协作</FONT></A></TD></TR>
              <TR>
                <TD><A 
                  href="http://www-900.ibm.com/developerWorks/cn/java/j-king/index.shtml#6"><FONT 
                  face=helvetica,helv,arial size=-2>读写锁</FONT></A></TD></TR>
              <TR>
                <TD><A 
                  href="http://www-900.ibm.com/developerWorks/cn/java/j-king/index.shtml#7"><FONT 
                  face=helvetica,helv,arial size=-2>部分创建的对象</FONT></A></TD></TR>
              <TR>
                <TD><A 
                  href="http://www-900.ibm.com/developerWorks/cn/java/j-king/index.shtml#7a"><FONT 
                  face=helvetica,helv,arial size=-2>volatile 
关键字</FONT></A></TD></TR>
              <TR>
                <TD><A 
                  href="http://www-900.ibm.com/developerWorks/cn/java/j-king/index.shtml#8"><FONT 
                  face=helvetica,helv,arial size=-2>访问的问题</FONT></A></TD></TR><!-- <tr><td><a href="#9">Immutability</A></font></td></tr>                        <tr><td><a href="#10">Instance-level access</A></font></td></tr> -->
              <TR>
                <TD><A 
                  href="http://www-900.ibm.com/developerWorks/cn/java/j-king/index.shtml#11"><FONT 
                  face=helvetica,helv,arial size=-2>后台程序的突然结束</FONT></A></TD></TR>
              <TR>
                <TD><A 
                  href="http://www-900.ibm.com/developerWorks/cn/java/j-king/index.shtml#12"><FONT 
                  face=helvetica,helv,arial size=-2>重新引入 stop、suspend 和 
                  resume</FONT></A></TD></TR>
              <TR>
                <TD><A 
                  href="http://www-900.ibm.com/developerWorks/cn/java/j-king/index.shtml#13"><FONT 
                  face=helvetica,helv,arial size=-2>被阻断的 I/O</FONT></A></TD></TR>
              <TR>
                <TD><A 
                  href="http://www-900.ibm.com/developerWorks/cn/java/j-king/index.shtml#14"><FONT 
                  face=helvetica,helv,arial size=-2>ThreadGroup 
              类</FONT></A></TD></TR>
              <TR>
                <TD><A 
                  href="http://www-900.ibm.com/developerWorks/cn/java/j-king/index.shtml#15"><FONT 
                  face=helvetica,helv,arial size=-2>总结</FONT></A></TD></TR>
              <TR>
                <TD><A 
                  href="http://www-900.ibm.com/developerWorks/cn/java/j-king/index.shtml#resources"><FONT 
                  face=helvetica,helv,arial size=-2>参考资料</FONT></A></TD></TR>
              <TR>
                <TD><A 
                  href="http://www-900.ibm.com/developerWorks/cn/java/j-king/index.shtml#author"><FONT 
                  face=helvetica,helv,arial size=-2>作者简介</FONT></A></TD></TR>
              <TR>
                <TD bgColor=#000000><FONT face=helvetica,helv,arial 
                  size=-3><IMG height=3 alt="" 
                  src="如果我是国王:关于解决 Java 编程语言线程问题的建议.files/c.gif" 
                  width=137></FONT></TD></TR></TBODY></TABLE><!-- End Table of Contents -->
            <BLOCKQUOTE>Allen Holub 指出,Java 
              编程语言的线程模型可能是此语言中最薄弱的部分。它完全不适合实际复杂程序的要求,而且也完全不是面向对象的。本文建议对 Java 
              语言进行重大修改和补充,以解决这些问题。</BLOCKQUOTE>
            <P>Java 语言的线程模型是此语言的一个最难另人满意的部分。尽管 Java 
            语言本身就支持线程编程是件好事,但是它对线程的语法和类包的支持太少,只能适用于极小型的应用环境。</P>
            <P>关于 Java 线程编程的大多数书籍都长篇累牍地指出了 Java 
            线程模型的缺陷,并提供了解决这些问题的急救包(Band-Aid/邦迪创可贴)类库。我称这些类为急救包,是因为它们所能解决的问题本应是由 
            Java 语言本身语法所包含的。从长远来看,以语法而不是类库方法,将能产生更高效的代码。这是因为编译器和 Java 虚拟器 (JVM) 
            能一同优化程序代码,而这些优化对于类库中的代码是很难或无法实现的。</P>
            <P>在我的《<I>Taming Java Threads</I>》(请参阅<A 
            href="http://www-900.ibm.com/developerWorks/cn/java/j-king/index.shtml#resources">参考资料</A>)书中以及本文中,我进一步建议对 
            Java 编程语言本身进行一些修改,以使得它能够真正解决这些线程编程的问题。本文和我这本书的主要区别是,我在撰写本文时进行了更多的思考, 
            所以对书中的提议加以了提高。这些建议只是尝试性的 -- 
            只是我个人对这些问题的想法,而且实现这些想法需要进行大量的工作以及同行们的评价。但这是毕竟是一个开端,我有意为解决这些问题成立一个专门的工作组,如果您感兴趣,请发 
            e-mail 到 <A 
            href="mailto:threading@holub.com">threading@holub.com</A>。一旦我真正着手进行,我就会给您发通知。</P>
            <P>这里提出的建议是非常大胆的。有些人建议对 Java 语言规范 (JLS)(请参阅<A 
            href="http://www-900.ibm.com/developerWorks/cn/java/j-king/index.shtml#resources">参考资料</A>)进行细微和少量的修改以解决当前模糊的 
            JVM 行为,但是我却想对其进行更为彻底的改进。</P>
            <P>在实际草稿中,我的许多建议包括为此语言引入新的关键字。虽然通常要求不要突破一个语言的现有代码是正确的,但是如果该语言的并不是要保持不变以至于过时的话,它就必须能引入新的关键字。为了使引入的关键字与现有的标识符不产生冲突,经过细心考虑,我将使用一个 
            ($) 字符,而这个字符在现有的标识符中是非法的。(例如,使用 $task,而不是 
            task)。此时需要编译器的命令行开关提供支持,能使用这些关键字的变体,而不是忽略这个美元符号。</P><A id=1 
            name=1></A>
            <P><STRONG class=subhead><I>task</I>(任务)的概念</STRONG><BR>Java 
            线程模型的根本问题是它完全不是面向对象的。面向对象 (OO) 
            设计人员根本不按线程角度考虑问题;他们考虑的是<I>同步</I>信息<I>异步</I>信息(同步信息被立即处理 -- 
            直到信息处理完成才返回消息句柄;异步信息收到后将在后台处理一段时间 -- 而早在信息处理结束前就返回消息句柄)。Java 编程语言中的 
            <CODE>Toolkit.getImage()</CODE> 
            方法就是异步信息的一个好例子。<CODE>getImage()</CODE> 
            的消息句柄将被立即返回,而不必等到整个图像被后台线程取回。</P>
            <P>这是面向对象 (OO) 的处理方法。但是,如前所述,Java 的线程模型是非面向对象的。一个 Java 编程语言线程实际上只是一个 
            <CODE>run()</CODE> 过程,它调用了其它的过程。在这里就根本没有对象、异步或同步信息以及其它概念。</P>
            <P>对于此问题,在我的书中深入讨论过的一个解决方法是,使用一个 <CODE>Active_object。</CODE> 
            <CODE></CODE>active 对象是可以接收异步请求的对象,它在接收到请求后的一段时间内以后台方式得以处理。在 Java 
            编程语言中,一个请求可被封装在一个对象中。例如,你可以把一个通过 <CODE>Runnable</CODE>接口实现的实例传送给此 
            active 对象,该接口的 <CODE>run()</CODE> 方法封装了需要完成的工作。该 runnable 对象被此 
            active 对象排入到队列中,当轮到它执行时,active 对象使用一个后台线程来执行它。</P>
            <P>在一个 active 对象上运行的异步信息实际上是同步的,因为它们被一个单一的服务线程按顺序从队列中取出并执行。因此,使用一个 
            active 对象以一种更为过程化的模型可以消除大多数的同步问题。</P>
            <P>在某种意义上,Java 编程语言的整个 Swing/AWT 子系统是一个 active 对象。向一个 Swing 
            队列传送一条讯息的唯一安全的途径是,调用一个类似 <CODE>SwingUtilities.invokeLater()</CODE> 
            的方法,这样就在 Swing 事件队列上发送了一个 runnable 对象,当轮到它执行时, Swing 
事件处理线程将会处理它。</P>
            <P>那么我的第一个建议是,向 Java 编程语言中加入一个 <I>task</I>(任务)的概念,从而将active 
            对象集成到语言中。( task的概念是从 Intel 的 RMX 操作系统和 Ada 
            编程语言借鉴过来的。大多数实时操作系统都支持类似的概念。)</P>
            <P>一个任务有一个内置的 active 对象分发程序,并自动管理那些处理异步信息的全部机制。</P>
            <P>定义一个任务和定义一个类基本相同,不同的只是需要在任务的方法前加一个 <CODE>asynchronous</CODE> 
            修饰符来指示 active 对象的分配程序在后台处理这些方法。请参考我的书中第九章的基于类方法,再看以下的 file_io 
            类,它使用了在《<I>Taming Java Threads</I>》中所讨论的 <CODE>Active_object</CODE> 
            类来实现异步写操作:</P>
            <TABLE class=code-sample cellPadding=0 width="100%" border=0>
              <TBODY>
              <TR>
                <TD><PRE><CODE><A id=Exception_handler name=Exception_handler>   interface Exception_handler</A>
 <A id=Exception_handler.handle_exception(Throwable) name=Exception_handler.handle_exception(Throwable)>   {   void handle_exception( Throwable e );</A>
    }

 <A id=File_io_task name=File_io_task>   class File_io_task</A>
    {   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;
        }

 <A id=File_io_task.write(byte[]) name=File_io_task.write(byte[])>       public void write( final byte[] bytes )</A>
        {
            // 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()
 <A id=File_io_task.run() name=File_io_task.run()>               {   public void run()</A>
                    {
                        try
                        {   byte[] copy new byte[ bytes.length ];
                            System.arrayCopy(   bytes,  0,
                                                copy,   0,
                                                bytes.length );
                            file.write( copy );
                        }
                        catch( Throwable problem )

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -