JavaFX的并发编程与UI更新

2 篇文章 0 订阅
1 篇文章 0 订阅

【项目需求】

根据项目需要,进行设备的并发测试,同时需要在界面上实时展示测试的结果

【涉及到的技术】

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;
			}
		};
	}
}

  • 0
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值