task(任务)的概念
Java 线程模型的根本问题是它完全不是面向对象的面向对象 (OO) 设计人员根本不按线程角度考虑问题他们考虑的是同步 信息 异步 信息(同步信息被立即处理 直到信息处理完成才返回消息句柄异步信息收到后将在后台处理一段时间 而早在信息处理结束前就返回消息句柄)Java 编程语言中的 ToolkitgetImage() 方法就是异步信息的一个好例子 getImage() 的消息句柄将被立即返回而不必等到整个图像被后台线程取回
这是面向对象 (OO) 的处理方法但是如前所述Java 的线程模型是非面向对象的一个 Java 编程语言线程实际上只是一个run() 过程它调用了其它的过程在这里就根本没有对象异步或同步信息以及其它概念
对于此问题在我的书中深入讨论过的一个解决方法是使用一个Active_object active 对象是可以接收异步请求的对象它在接收到请求后的一段时间内以后台方式得以处理在 Java 编程语言中一个请求可被封装在一个对象中例如你可以把一个通过 Runnable 接口实现的实例传送给此 active 对象该接口的 run() 方法封装了需要完成的工作该 runnable 对象被此 active 对象排入到队列中当轮到它执行时active 对象使用一个后台线程来执行它
在一个 active 对象上运行的异步信息实际上是同步的因为它们被一个单一的服务线程按顺序从队列中取出并执行因此使用一个 active 对象以一种更为过程化的模型可以消除大多数的同步问题
在某种意义上Java 编程语言的整个 Swing/AWT 子系统是一个 active 对象向一个 Swing 队列传送一条讯息的唯一安全的途径是调用一个类似SwingUtilitiesinvokeLater() 的方法这样就在 Swing 事件队列上发送了一个 runnable 对象当轮到它执行时 Swing 事件处理线程将会处理它
那么我的第一个建议是向 Java 编程语言中加入一个task (任务)的概念从而将active 对象集成到语言中( task的概念是从 Intel 的 RMX 操作系统和 Ada 编程语言借鑒过来的大多数实时操作系统都支持类似的概念)
一个任务有一个内置的 active 对象分发程序并自动管理那些处理异步信息的全部机制
定义一个任务和定义一个类基本相同不同的只是需要在任务的方法前加一个asynchronous 修饰符来指示 active 对象的分配程序在后台处理这些方法
所有的写请求都用一个dispatch() 过程调用被放在 activeobject 的输入队列中排队在后台处理这些异步信息时出现的任何异常 (exception) 都由 Exception_handler 对象处理此 Exception_handler 对象被传送到 File_io_task 的构造函数中
这种基于类的处理方法其主要问题是太复杂了 对于一个这样简单的操作代码太杂了
[] [] [] [] [] [] []