1

我有一个 Java 程序,目前在高峰时间会冻结。我正在寻找原因。现在,我的想法是因为有些代码不是AJAX,所以在高峰时段从服务器请求JSON对象时它会挂在那里(高峰时段互联网速度很慢)。但我不太确定它不是 AJAX。我不能在这里粘贴所有代码,因为它与公司的财产有关,所以我要写一些代码/伪代码。该程序使用以下内容来执行请求。

 URL url = new URL("http://www.xxxxxxxx.com/");
 URLConnection conection = url.openConnection();
 BufferedReader in = new BufferedReader(new InputStreamReader(conection .getInputStream()));
 String inputLine;
 String content = "";
 while ((inputLine = in.readLine()) != null) { 
            content += inputLine;
        }
 in.close();
 json = new JSONObject(content);

上面的代码是程序的一些片段,我认为它会导致冻结。我的问题是,这段代码似乎没有使用任何 AJAX,也不是多线程,对吧?所以当互联网连接很慢时它会挂在那里(冻结)?我对此不是很有经验。请帮忙。

如果您认为这不是导致冻结的主要原因,那么一般来说,此类问题最可能的原因是什么。先感谢您。

编辑/更新:

  1. 我的程序是一个在客户端运行的摇摆程序。此应用程序没有真正的服务器端代码。URL 地址是提供程序需要的某种数据的第 3 方服务器。我没有看到该程序使用任何线程。正如我所见,它基本上是核心Java,没有使用任何线程,而且我对多线程不是很熟悉,所以我不确定。(程序不是我写的,是一些以前的程序员写的)这就是为什么我在考虑它可能没有使用其他线程来运行这个服务器请求。

  2. 我所说的冻结是指UI 在高峰时段尝试运行某些特定功能时会冻结几秒钟。我写的上面的代码是这些函数的一些片段。在 UI 冻结一段时间后,它会在其余部分按预期工作。然而,在非高峰时段,它就像一个魅力。

  3. 具体来说, BufferedReader in = new BufferedReader(new InputStreamReader(connection .getInputStream())); 是我认为导致问题的原因。有人可以证实吗?

4

2 回答 2

1
  • 所有异步方法,如 HTTP POST/GET,都在单独的线程中实现。用户对查看您的应用程序在后台执行的操作不感兴趣。

  • 此外,使用 String 进行追加并不是一个好习惯,就像 jlordo 说的那样,使用StringBuilderor StringBuffer

    StringBuilder buff= new StringBuilder(); while ((inputLine = in.readLine()) != null) {

        if(!"".equals(line).trim){
            buff.append(line).append("\n");
         }           
    }
    

    附寄();

  • 您可以在会话中添加超时,以确保应用程序根本不会卡住。

[编辑]

关于问题的变化,我不认为

BufferedReader in = new BufferedReader(new InputStreamReader(connection .getInputStream()));

这是你的问题。

您可以尝试执行后续流程,但我仍然考虑使用 GUI 线程分离线程

InputStream is = conection .getInputStream();
InputStreamReader isr = new InputStreamReader(is);
BufferedReader br = new BufferedReader(isr);
String line = null;
while ( (line = br.readLine()) != null) {
于 2013-08-02T21:51:25.407 回答
1

您可能希望使用SwingWorker线程来调用服务器。这样,当它很忙时,用户界面就不会冻结。

但是,请记住,在新数据到达之前,您不会在屏幕上看到新数据将提供的结果更改。

请参阅Oracle SwingWorker JavaDocs

与您的示例类似的教程

于 2013-08-02T22:18:25.343 回答