ICode9

精准搜索请尝试: 精确搜索
首页 > 编程语言> 文章详细

同步java与javaFX线程

2021-06-27 21:02:33  阅读:224  来源: 互联网

标签:java get sr args javaFX Platform 线程 new


技术概述

JavaFX是单线程编程,所有对界面的操作都会交给唯一的线程Application Thread去处理。因此需要使用线程同步技术来避免异常。在实际应用中,我们房间是在开始游戏之前创建的,而游戏开始后又要处理传来的倒计时,图像,答案,聊天等数据并显示。这就需要java与javaFX线程的同步。

技术详述

使用Platform.runLater(...)实现多线程

Platform.runLater(...)是javafx.application包里自带的任务队列,原理是把你要执行的动作添加到类似队列中,等Application Thread线程空闲时处理,还是主线程(Application Thread)处理的,你的那个线程只是放在等待队列了。
使用时传入参数需要继承 runnable
我们在游戏中使用还加入了Timer来定时刷新数据。
代码结构如下

new Timer().schedule(new TimerTask() {
			        public void run() {
			        	Platform.runLater(new Runnable() {
							public void run() {
								//子线程代码
							}			        		
			        	});
			        }
				}, 2000);

解决办法

Timer timer = new Timer();
		timer.schedule(new TimerTask() {

			public void run() {
				synchronized (flag) {
					
					if (flag) {
						NewIo.send(ClientPost.Type.IM_ALIVE, new HashMap<>());
						ServerReturn sr = NewIo.send(ClientGet.Type.STATE, new HashMap<>());
						
						ArrayList<TernaryTuple<Integer, String, Boolean>> infolist = (ArrayList<TernaryTuple<Integer, String, Boolean>>) sr.args
								.get("players");
						ArrayList<BinaryTuple<String, String>> chatlist1 = (ArrayList<BinaryTuple<String, String>>) sr.args
								.get("chat_list");

						//ai++;
						System.out.println("\n房主debug"+sr.args.toString());
						
						Platform.runLater(new Runnable() {
							@Override
							public void run() {
								// 更新JavaFX的主线程的代码放在此处
								if (chatlist1 != null) {
									for (BinaryTuple<String, String> cl : chatlist1) {
										chatlist.add(cl.first + " :" + cl.second);
										
									}
								}								
								getchatlist.setItems(chatlist);
								VBox vb = OwnerGame.rebuildleft(sr);
								bp.setLeft(vb);
								if(sr.args.get("guessed")!=null) {
									answerlist.add("系统消息  "+sr.args.get("guessed")+"猜对了");
									getanswerlist.setItems(answerlist);
								}
								if(sr.args.get("state").equals(State.CHOICE_TIME)) {
									answerlist.clear();
									answerlist.add("游戏开始本界面用于答题");
									getanswerlist.setItems(answerlist);
								}
								if(sr.args.get("drawed") != null) {
									dngdc.addDraw((List<TernaryTuple<Object, Object, List<BinaryDoubleTuple>>>) sr.args.get("drawed"));
								}
								bp.setCenter(rebuilddng(dngbp,sr));

							}
						});

					} else {
						NewIo.send(ClientPost.Type.QUIT, new HashMap<>());
					}
				}

			}
		}, 1,1000);

这种方法实质是使用 JavaFx 自带的一个任务队列, vafx.application.Platform.runlater。将 gui 更新任务放到队列里待更新, 传入参数需要继承 runnable。
用这种方法就能避免子线程直接更新gui造成的异常。

总结

使用Platform.runLater(...)构造工作队列即可实现java和javaFx的多线程同步。

参考

阅读JavaFx文档,查Stack Overflow并在组里大佬的帮助下完成。

标签:java,get,sr,args,javaFX,Platform,线程,new
来源: https://www.cnblogs.com/dqcx2411/p/14934876.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有