快速业务通道

关于解决Java编程语言线程问题的建议 - 编程入门网

作者 佚名技术 来源 NET编程 浏览 发布时间 2012-06-20
绿色线程。(在 Thread() 类中的缺省 run() 方法会在内部有效地创建第二个 Runnable 对象。)

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

时间:2011-01-24 Allen Holub

线程间的协作

应在语言中加入更多的功能以支持线程间的相互通信。目前, PipedInputStream 和 PipedOutputStream 类可用于这个目的。但是对于大多数应用程序,它们太弱了。我建议向 Thread 类加入下列函数:

增加一个 wait_for_start() 方法,它通常处于阻塞状态,直到一个线程的 run() 方法启动。(如果等待的线程在调用 run 之前被释放,这没有什么问题)。用这种方法,一个线程可以创建一个或多个辅助线程,并保证在创建线程继续执行操作之前,这些辅助线程会处于运行状态。

(向 Object 类)增加 $send (Object o) 和 Object=$receive() 方法,它们将使用一个内部阻断队列在线程之间传送对象。阻断队列应作为第一个 $send() 调用的副产品被自动创建。 $send() 调用会把对象加入队列。 $receive() 调用通常处于阻塞状态,直到有一个对象被加入队列,然后它返回此对象。这种方法中的变量应支持设定入队和出队的操作超时能力: $send (Object o, long timeout) 和 $receive (long timeout)。

对于读写锁的内部支持

读写锁的概念应内置到 Java 编程语言中。读写器锁在“ Taming Java Threads ”(和其它地方)中有详细讨论,概括地说:一个读写锁支持多个线程同时访问一个对象,但是在同一时刻只有一个线程可以修改此对象,并且在访问进行时不能修改。读写锁的语法可以借用 synchronized 关键字:

static Object global_resource; //... public void a()    {      $reading( global_resource )      {  // While in this block, other threads requesting read        // access to global_resource will get it, but threads        // requesting write access will block.      }    } public void b()    {      $writing( global_resource )      {  // Blocks until all ongoing read or write operations on        // global_resource are complete. No read or write        // operation or global_resource can be initiated while        // within this block.      }    } public $reading void c()    {  // just like $reading(this)...    } public $writing void d()    {  // just like $writing(this)...    }

对于一个对象,应该只有在 $writing 块中没有线程时,才支持多个线程进入 $reading 块。在进行读操作时,一个试图进入 $writing 块的线程会被阻断,直到读线程退出 $reading 块。 当有其它线程处于 $writing 块时,试图进入 $reading 或 $writing 块的线程会被阻断,直到此写线程退出 $writing 块。

如果读和写线程都在等待,缺省情况下,读线程会首先进行。但是,可以使用 $writer_priority 属性修改类的定义来改变这种缺省方式。如:

$write_priority class IO {    $writing write( byte[] data )    {  //...    } $reading byte[] read( )    {  //...    } }

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

时间:2011-01-24 Allen Holub

访问部分创建的对象应是非法的

当前情况下,JLS 允许访问部分创建的对象。例如,在一个构造函数中创建的线程可以访问正被创建的对象,既使此对象没有完全被创建。下面代码的结果无法确定:

class Broken    {  private long x; Broken()      {  new Thread()        {  public void run()          {  x = -1;          }   

凌众科技专业提供服务器租用、服务器托管、企业邮局、虚拟主机等服务,公司网站:http://www.lingzhong.cn 为了给广大客户了解更多的技术信息,本技术文章收集来源于网络,凌众科技尊重文章作者的版权,如果有涉及你的版权有必要删除你的文章,请和我们联系。以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢!

分享到: 更多

Copyright ©1999-2011 厦门凌众科技有限公司 厦门优通互联科技开发有限公司 All rights reserved

地址(ADD):厦门软件园二期望海路63号701E(东南融通旁) 邮编(ZIP):361008

电话:0592-5908028 传真:0592-5908039 咨询信箱:web@lingzhong.cn 咨询OICQ:173723134

《中华人民共和国增值电信业务经营许可证》闽B2-20100024  ICP备案:闽ICP备05037997号