java - 重复调用 Java 函数

标签 java

我不是 CS 大师也不是 Java 专家,所以如果以下问题的答案显而易见,请原谅我:

我构建了一个类来处理向 HTTP 服务器发送查询、获取响应并将该响应返回给调用者。

我的问题是这样的;如果我调用一次那个函数,响应时间很长,在延迟期间,我再次调用它,延迟的第一次调用会不会干扰第二次调用的执行?

应大众需求...这里是一些源代码:

package com.cambrothers.wms.module;

import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.net.URL;
import java.net.URLConnection;
import java.util.HashMap;

public class ServerComm {
public HashMap<String, String> sendData(String endpoint, String requestParameters){
    HashMap<String, String> response_data = new HashMap<String, String>();

    System.out.println("GetRequest");
    if (endpoint.startsWith("http://"))
    {
        // Send a GET request to the servlet
        try
        {

            // Send data
            String urlStr = endpoint;
            if (requestParameters != null && requestParameters.length () > 0)
            {
                urlStr += "?" + requestParameters;
            }
            URL url = new URL(urlStr);
            URLConnection conn = url.openConnection ();

            // Get the response
            BufferedReader rd = new BufferedReader(new InputStreamReader(conn.getInputStream()));
            StringBuffer sb = new StringBuffer();
            String line;
            while ((line = rd.readLine()) != null)
            {
                sb.append(line);
            }
            rd.close();
            String result = sb.toString();
            String[] values = result.split("&");
            String[] kp = null;
            for(int i =0; i < values.length ; i++){
                kp = values[i].split("=");
                response_data.put(kp[0], kp[1]);
            }

        } catch (Exception e)
        {
            e.printStackTrace();
        }
    }

    return response_data;
}
}

保重

最佳答案

您所描述的复杂程度超过了典型的初级到中级程序员在大学类(class)之外的水平,这很好。但是让我们看看你的问题意味着什么。

您说“我调用了该函数一次,响应时间很长”。因此,我认为可以安全地假设您使用的是同步请求函数,该函数在响应从服务器返回之前不会返回。

然后你说“延迟期间,我再调用一次”。这意味着您正在使用 threading ,我在 this SO answer 中详细描述了一个概念.如果您不熟悉,请立即停止,阅读线程并真正理解它们,然后再尝试编写您的问题描述的代码。熟悉的?继续阅读。

现在回答您的实际问题。

will the delayed first call interfere with the execution of the second call?

不会,不会有干扰from the kernel and JVM's point of view ,因为单独的线程单独执行。但是,从实际的角度来看,会不会有干扰完全取决于你的代码。 Thread safety是一个太大的话题,无法在单个 StackOverflow 答案中解释,但它是这里的关键。不过,我可以提供一些指示。请记住,这些指针指向执行 HTTP 提取的函数。

  1. 如果你的 HTTP 抓取函数是 reentrant ,它自动是线程安全的。要可重入,该函数不得引用任何可能发生变化的静态或全局数据,并且不得调用任何不可重入代码。您的函数很可能不引用静态数据,但您使用的 HTTP 库不可重入,因此您的 HTTP 获取函数也不可重入。

  2. 如果您的 HTTP 抓取函数和/或其调用者使用了正确的锁定(正确锁定通常是一个非常困难的问题,大学类(class)可能会花两周的时间讲授锁定、避免死锁等) ,整个过程是线程安全的。我知道“适当的锁定”被定义为“使进程线程安全的锁定”,所以这不是很有用,但更有用的规则是锁定任何 critical section .如果两个线程可能访问(并且一个或两个都可能改变)共享资源,那么您需要锁定对该共享资源的访问。请注意,您不仅需要锁定对资源的写入访问权限,还需要锁定读取访问权限。

  3. 如果您使用了更奇特的结构,例如无锁数据结构,并且您表现出正确性,那么您的程序就是正确的。不过,这些更难做到正确。

请注意,如果您的所有程序数据和资源都是不可变的,则默认情况下所有函数都是可重入的,这意味着您的程序自动是线程安全的。在实践中,所有数据和资源都是完全不可变的程序还有一些不足之处,但如果您将可变性限制在程序的一个小区域并证明该区域的线程安全性,您的整个程序仍然是线程安全的。

关于java - 重复调用 Java 函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10809602/

相关文章:

java - 模块之间的依赖管理

java - 将对象数组传递给方法

java - 您将 JPopupMenu 的逻辑存储在哪里?

java - 如何在 Eclipse 中使用交叉引用包编译项目

java - 将项目转换为 Maven 项目后 JAR 内容不正确

java - 将多个索引项转换为流的最简单方法

java - 是否可以模拟 Java Protocol Buffer 消息?

java - 在 Java 构造函数中访问变量并在类的其余部分中使用

java - ThreadPoolExecutor - 即使没有线程空闲,也会更改池大小

java - 如何检查对话框是否已关闭?