Java 开发 2.0: Kilim 简介
2010-05-21 00:00:00 来源:WEB开发网从清单 2 可以看到,DeferredDivision 类扩展了 Kilim 的 Task 类型,后者实际上模仿了角色模型。注意,该类还改写了 Task 的 execute 方法,后者默认情况下抛出 Pausable。因此,execute 的操作将在 Kilim 的调度程序控制下进行。也就是说,Kilim 将确保 execute 以一种安全的方式并行地运行。
在 execute 方法内部,DeferredDivision 创建 Calculation 的实例并将它们放在 Mailbox 中。它使用 putnb 方法以一种非阻塞方式完成此任务。
填充 mailbox 后,DeferredDivision 进入休眠状态 —— 注意,与处于休眠状态的内核线程不同,它是由 Kilim 托管的轻量型线程。当角色唤醒之后,像前面提到的一样,它在 mailbox 中查找任何 Calculation。此调用也是非阻塞的,这意味着 getnb 可以返回 null。如果 DeferredDivision 找到一个 Calculation 实例,并且该实例的 getAnswer 方法有一个值(也就是说,不是一个已由 Calculator 类型处理过的 Calculation 实例),它将该值打印到控制台。
Calculator
Mailbox 的另一端是 Calculator。与清单 2 中定义的 DeferredDivision 角色类似,Calculator 也扩展了 Kilim 的 Task 并实现了 execute 方法。一定要注意两个角色都共享同一个 Mailbox 实例。它们不能与不同的 Mailbox 通信,它们需要共享一个实例。相应地,两个角色都通过它们的构造函数接受一个有类型 Mailbox。
清单 3. 最终的实际运算角色:Calculator
import java.math.RoundingMode;
import kilim.Mailbox;
import kilim.Pausable;
import kilim.Task;
public class Calculator extends Task{
private Mailbox<Calculation> mailbox;
public Calculator(Mailbox<Calculation> mailbox) {
super();
this.mailbox = mailbox;
}
@Override
public void execute() throws Pausable, Exception {
while (true) {
Calculation calc = mailbox.get(); // blocks
if (calc.getAnswer() == null) {
calc.setAnswer(calc.getDividend().divide(calc.getDivisor(), 8,
RoundingMode.HALF_UP));
System.out.println("Calculator determined answer");
mailbox.putnb(calc);
}
Task.sleep(1000);
}
}
}
更多精彩
赞助商链接