问题描述
各位大大俺现在在做的程序,是swing做前端,有webservice做后端,所以有服务器延迟响应的问题。又因为,给服务器发出request到服务器返回数据,需要冻结整个frame,所以,这里产生了服务器如果持续无返回则frame整个死锁的问题,所以想设置一个超时的限制没有超时的代码是这样的:serverCallCompleted=false;if(SwingUtilities.isEventDispatchThread()){Runnablerunnable=newRunnable(){publicvoidrun(){while(!serverCallCompleted)Thread.yield();}};WaitDialogdlg=newWaitDialog(_frame,message,newDimension(300,60),runnable);dlg.setVisible(true);}
其中serverCallCompleted就是一个bool的类型,初始化为false,只有服务器有返回值时才变成true。除此以外的时间,当前frame上的所有线程全部yield,dlg则是我自己做的一个没有任何按钮的dialog,用来显示当前的状态,比如“程序加载中”很大问题是,请问,怎么加计时器?会不会很大改动?当前的代码已经有不少做出如此的部署,是不是要整个重写?我自己想了个办法,不知各位大大觉得如何:我想在dlg被设置为setVisible(true)的时候,获取dialog弹出时系统的分钟数,然后在run()方法里,不断的检测当前的分钟数,如果两者想减大于2(也就是过了两分钟),就跳出。代码如下if(SwingUtilities.isEventDispatchThread()){Runnablerunnable=newRunnable(){publicvoidrun(){intcurrentMinute=calendar.get(Calendar.MINUTE);while(!serverCallCompleted&&abs(currentMinute-minuteWhenPopup)<2)Thread.yield();}};WaitDialogdlg=newWaitDialog(_accountContactController.getAccountContactFrame(),message,newDimension(300,60),runnable);dlg.setVisible(true);minuteWhenPopup=calendar.get(Calendar.MINUTE);//minuteWhenPopup全局变量}
请问这个方法是不是很白痴?因为好像网上从没这么搞过。请各位路过的朋友指点,谢谢了!!