使用实时Java进行开发,第1部分 探索实时Java的独特功能(8)
时间:2011-01-27 IBM Sean C. Foley
综合示例
下一个示例演示了到目前为止介绍的一些实时特性。首先,清单 5 展示了两个类,它们分别是事件数据的生成者和使用者。两个类都是 Runnable 的实现,所以它们可以由任何给定 Schedulable 对象轻松执行。
清单 5. 事件对象的生成者和使用者类
class Producer implements Runnable {
volatile int eventIdentifier;
final Thread listener;
Producer(Thread listener) {
this.listener = listener;
}
public void run() {
LinkedList<Integer> events = getEvents();
synchronized(listener) {
listener.notify();
events.add(++eventIdentifier); //autoboxing creates an Integer object here
}
}
static LinkedList<Integer> getEvents() {
ScopedMemory memoryArea = (ScopedMemory) RealtimeThread.getCurrentMemoryArea();
LinkedList<Integer> events =
(LinkedList<Integer>) memoryArea.getPortal();
if(events == null) {
synchronized(memoryArea) {
if(events == null) {
events = new LinkedList<Integer>();
memoryArea.setPortal(events);
}
}
}
return events;
}
}
class Consumer implements Runnable {
boolean setConsuming = true;
volatile boolean isConsuming;
public void run() {
Thread currentThread = Thread.currentThread();
isConsuming = true;
try {
LinkedList<Integer> events = Producer.getEvents();
int lastEventConsumed = 0;
synchronized(currentThread) {
while(setConsuming) {
while(lastEventConsumed < events.size()) {
System.out.print(events.get(lastEventConsumed++) + " ");
}
currentThread.wait();
}
}
} catch(InterruptedException e) {
} finally {
isConsuming = false;
}
}
}
使用实时Java进行开发,第1部分 探索实时Java的独特功能(9)
时间:2011-01-27 IBM Sean C. Foley
在 清单 5 中,生成者和使用者对象访问一个事件队列,这些事件被编码为一系列 java.lang.Integer 对象。代码期望当前的分配上下文为一个范围内存区域,期望事件队列存储为范围的门户对象。(门户是从范围分配的对象,可以存储在范围内存区域对象自身之中。它非常方便有用,因为范围对象既不能存储在静态字段中,也不能存储在从父范围分配的对象中)。如果未找到队列,将创建该队列。使用两个可变字段来向所关注线程告知事件的生成和使用进度。
清单 6 中的两个类展示了如何执行 清单 5 中的代码:
清单 6. 可调度的类
class NoHeapHandler extends AsyncEventHandler {
final MemoryArea sharedArea;
final Producer producer;
NoHeapHandler(
PriorityScheduler scheduler,
ScopedMemory sharedArea,
Producer producer) {
|