java - 从服务器请求 JSON 时客户端卡住

标签 java ajax multithreading

我有一个 Java 程序,在目前的高峰时段会卡住。我正在寻找原因。目前我的想法是,因为有些代码不是AJAX,所以在高峰时段向服务器请求JSON对象时会卡在那里(高峰时段网速很慢)。但我不太确定它不是 AJAX。我无法将所有代码都粘贴到这里,因为它与公司属性(property)有关,所以我将编写一些代码/伪代码。该程序使用以下内容来执行请求。

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

  2. 我所说的卡住是指UI 在高峰时段尝试运行某些特定功能时会卡住几秒钟。我编写的上面的代码是这些函数的一些片段。用户界面卡住一段时间后,其余时间将按预期工作。然而,在非高峰时段,它却很有魅力。

  3. 具体来说,BufferedReader in = new BufferedReader(new InputStreamReader(conection .getInputStream())); 是我的想法 这会导致问题。谁能证实这一点?

最佳答案

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

  • 此外,使用 String 进行追加并不是一个好习惯,就像 jlordo 所说,使用 StringBuilderStringBuffer

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

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

    in.close();

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

[编辑]

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

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

这是你的问题。

您可以尝试执行以下流程,但我仍然考虑使用 GUI 线程单独的线程

InputStream is = conection .getInputStream();
InputStreamReader isr = new InputStreamReader(is);
BufferedReader br = new BufferedReader(isr);
String line = null;
while ( (line = br.readLine()) != null) {

关于java - 从服务器请求 JSON 时客户端卡住,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18026624/

相关文章:

java包不存在gradle构建失败

java - 具有未知实现类的通用工厂

java - 是否可以将自定义组件添加到 Android 中的首选项 Activity 中?

java - Spring @RequestParam 和 req.getParameter ("xx") 的工作方式不同吗?

jquery - 使用 AJAX/jQuery 发布到 Facebook 墙/提要

javascript - 通过 AJAX 检索 blob 时处理错误消息

java - Hazelcast:具有多 CPU 机器的集群上的线程数

java - 使用 mockito 验证调用之间的时间

c++ - 多线程 C++11 应用程序中的同步

java - 如何强制中断SwingWorker?