【项目需求】
根据项目需要,进行设备的并发测试,同时需要在界面上实时展示测试的结果
【涉及到的技术】
1、使用Observer的方式实现多个对象之间的通信(观察者模式)
2、因为UI只有一个,需要在较短时间内接收并显示大量的数据,所以使用了javafx.concurrent
3、线程池pool,减少对象的资源占用
上述技术的使用参考了大量的网络资源和书籍内容,再次不进行一一列举,感谢各位作者。
【核心代码】
// 1、从线程池中获取对象
ObjectPoolDrawUIService objPool = ObjectPoolDrawUIService.getInstance();
DrawUIService obj = (DrawUIService)objPool.getObject();
// 2、对象的初始化 produceCaseResult是需要更新的数据内容 ,i是行号信息,放在Object[]中进行传递
obj.init(new Object[]{produceCaseResult,i}, new EventHandler<WorkerStateEvent>() {
@Override
public void handle(WorkerStateEvent t) {
Object[] objArray = (Object[])t.getSource().getValue();
testDetailList.set((int) objArray[1], (ProduceCaseResult)objArray[0]);
// 4、因为是在线程中执行,所以 returnObject代码不能跟在obj.restart后面,会导致被很快的restart
objPool.returnObject(obj);
}
});
// 3、执行
obj.restart(); // 因为是从pool中获取,可能已经执行完毕,所以restart
以上代码中需要特别注意,代码4的位置,以下代码为javafx.concurrent的核心代码
public class DrawUIService extends Service<Object[]>{
Object[] showData = {null,null};
public void init(Object[] showData, EventHandler<WorkerStateEvent> eventHandler) {
this.showData = showData;
setOnSucceeded(eventHandler);
}
@Override
protected Task<Object[]> createTask() {
return new Task<Object[]>() {
@Override
protected Object[] call() throws Exception {
return showData;
}
};
}
}