我正在尝试进行一些异步编程,但我的Java技能有点生疏......
这是我的代码:
private static String uname="xxx";
private static String pword="xxx";
private static int productId=82;
private static String sessionToken="";
public static void main(String[] args)
{
BFGlobalService_Service service=new BFGlobalService_Service();
BFGlobalService betfair=service.getBFGlobalService();
System.out.println("hello");
LoginReq loginReq=new LoginReq();
loginReq.setUsername(uname);
loginReq.setPassword(pword);
loginReq.setProductId(productId);
loginReq.setLocationId(0);
loginReq.setVendorSoftwareId(0);
LoginResp loginResp=new LoginResp();
loginResp=betfair.login(loginReq); //this line is very slow ;(
sessionToken=loginResp.getHeader().getSessionToken();
...
}
“loginResp = betfair.login(loginReq)”这一行需要时间(我有一个非常慢的3G网络)并且支持整个程序流程。完成后可以举起活动吗?
即。我想要这种事件处理程序伪代码:
private void handleNewLoginResp(...)
{
System.out.println("login response received");
sessionToken=loginResp.getHeader().getSessionToken();
}
我希望这很简单!我试过谷歌搜索,但我能找到的只是关于GUI等的文章。enter code here
答案 0 :(得分:0)
如果没有可用的login()
函数的非阻塞版本,您应该在一个单独的线程中运行它,并在事件完成时触发它。
请注意,使用多个线程意味着您必须考虑并发问题。
您需要查找线程安全,java synchronized
关键字和监听器等内容。
(听众(或事件听众)是非必要的,但它们是您制作精心设计的解决方案所需的设计理念。)
答案 1 :(得分:0)
阅读Java Concurrency。假设您有一个用户界面,那么您将需要使用SwingWorker或任何与您的环境等效的功能。
<强>更新强>
唯一可能让你失望的部分是在后台线程的上下文中调用一个监听器,而不是主线程。因此,您需要使用同步块来确保在后台线程上创建的对象从线程的缓存刷新到公共内存。
与为GUI编写custom event handling没什么不同。 (这就是为什么你在搜索时找不到任何东西的原因。)