Java事件:慢速网络
我正在尝试做一些异步编程,但是我的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
# 1 楼答案
仔细阅读Java Concurrency。假设您有一个UI,您将希望使用SwingWorker,或者任何与您的环境功能相当的东西
更新:
唯一可能让您绊倒的是,侦听器将在后台线程的上下文而不是主线程的上下文上调用。因此,您需要使用同步块来确保在后台线程上创建的对象从线程的缓存刷新到公共内存
这与为GUI编写custom event handling没有什么不同。(这就是为什么搜索时找不到任何东西。)
# 2 楼答案
如果没有可用的
login()
函数的非阻塞版本,则应在单独的线程中运行它,并在完成时触发事件注意,使用多个线程意味着必须考虑并发问题。 您需要查找诸如线程安全、java
synchronized
关键字和侦听器之类的内容(监听器(或事件监听器)是非必需的,但它们是您需要的设计概念,以便制定一个精心设计的解决方案。)