什么会导致Java命令的“无害”序列挂起?

什么会导致Java命令的“无害”序列挂起?,java,Java,其中一个构造函数具有以下命令序列: log.info("A new session of the game started."); clientsListener = new ClientsListener(earPort, userName, players, this); public static ServiceBrowser getBrowser(String serviceType, Game game) { if (!name2browser.containsKey(serv

其中一个构造函数具有以下命令序列:

log.info("A new session of the game started.");
clientsListener = new ClientsListener(earPort, userName, players, this);
public static ServiceBrowser getBrowser(String serviceType, Game game) {
   if (!name2browser.containsKey(serviceType)) {
      name2browser.put(serviceType, new ServiceBrowser(serviceType, game));
   }
   return name2browser.get(serviceType);
}
在日志文件中,我有代码第一行生成的语句。ClientsListener的构造函数按以下方式编写:

public ClientsListener(int earPort, String userName, String[] players, Game game) {
   this.earPort = earPort;
   this.userName = userName;
   this.players = players;
   this.game = game;
   ServiceBrowser browser;
   for (String playerName: players) {
      String serviceType = "_" + playerName + "._tcp.";
      browser = BrowsersGenerator.getBrowser(serviceType,game);
      browser.post(userName + ":infoRequest=infoRequest");
   }
}
BrowsersGenerator.getBrowser具有以下简单的命令序列:

log.info("A new session of the game started.");
clientsListener = new ClientsListener(earPort, userName, players, this);
public static ServiceBrowser getBrowser(String serviceType, Game game) {
   if (!name2browser.containsKey(serviceType)) {
      name2browser.put(serviceType, new ServiceBrowser(serviceType, game));
   }
   return name2browser.get(serviceType);
}
在上面的方法中,我实例化了ServiceBrowser。此类的构造函数是:

public ServiceBrowser(String serviceType, Game game) {
   this.serviceType = serviceType;
   this.game = game;
   status = "notActivated";
}
然后,在ClientsListener的构造函数中,我调用browser.post的代码的第二块。此方法的第一行包含以下内容:

game.log.fine("We entered the post method");

日志文件中没有这个语句。因此,软件挂起在两次尝试写入日志文件之间。我不知道代码中坏疽的部分在哪里。在我看来一切都很好。主要的问题是我无法重现这个问题。这种情况非常罕见,我只有一个日志文件要分析。谁能帮我一下吗?

如果browser.post照它说的做,一切都可能发生。但最有可能的情况是,您的程序在等待某个防火墙未给出的响应时挂起。

您似乎有ServiceBrowser的子类。您确定他们在post方法的开头都有一个log命令吗?您还可以尝试查看在调用特定类型的ServiceBrowser时是否挂起


当进程挂起时,您可以在远程java进程上使用一些工具,如jconsole或jstat来查看当前堆栈跟踪,并找出它挂起的位置。

您在构造函数中做了大量工作,包括建立网络连接。这通常被认为是不好的做法。只需在构造函数中构造对象,然后在单独的方法中执行网络操作。@Paul Tomblin,这会导致问题吗?如果这些方法中的任何一个抛出异常,您将得到一个半构造的对象。看起来browser.post没有任何作用,因为此方法的第一行应该生成日志文件的输出,而它没有。因此,即使方法的第一行也不会执行。此外,据我所知,在给定的代码中我没有使用防火墙。