现有的覆盖(override)Thread 对象并实现 run() 的习惯继续有效但是它应映射到一个被绑定到一轻便进程的绿色线程(在 Thread() 类中的缺省 run() 方法会在内部有效地创建第二个 Runnable 对象)
线程间的协作
应在语言中加入更多的功能以支持线程间的相互通信目前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 (和其它地方)中有详细讨论概括地说一个读写锁支持多个线程同时访问一个对象但是在同一时刻只有一个线程可以修改此对象并且在访问进行时不能修改
对于一个对象应该只有在$writing 块中没有线程时才支持多个线程进入 $reading 块在进行读操作时一个试图进入 $writing 块的线程会被阻断直到读线程退出 $reading 块 当有其它线程处于 $writing 块时试图进入 $reading 或 $writing 块的线程会被阻断直到此写线程退出 $writing 块
如果读和写线程都在等待缺省情况下读线程会首先进行但是可以使用$writer_priority 属性修改类的定义来改变这种缺省方式
访问部分创建的对象应是非法的
当前情况下JLS 允许访问部分创建的对象例如在一个构造函数中创建的线程可以访问正被创建的对象既使此对象没有完全被创建
设置x 为 的线程可以和设置 x 为 的线程同时进行所以此时 x 的值无法预测
对此问题的一个解决方法是在构造函数没有返回之前对于在此构造函数中创建的线程既使它的优先级比调用new 的线程高也要禁止运行它的 run() 方法
这就是说在构造函数返回之前start() 请求必须被推迟
另外Java 编程语言应可允许构造函数的同步换句话说下面的代码(在当前情况下是非法的)会象预期的那样工作
我认为第一种方法比第二种更简洁但实现起来更为困难
volatile关键字应象预期的那样工作
JLS 要求保留对于 volatile 操作的请求大多数 Java 虚拟机都简单地忽略了这部分内容这是不应该的在多处理器的情况下许多主机都出现了这种问题但是它本应由 JLS 加以解决的如果您对这方面感兴趣马里兰大学的 Bill Pugh 正在致力于这项工作(请参阅参考资料 )
[] [] [] [] [] [] []