0

我有一个自定义服务模块,我在其中传递了一个 JSON 主体,其中包含一组 ID。我必须遍历这些 ID 并使用每个 ID 进行单独的 Web 服务调用以获得响应正文,然后将这些响应聚合到自定义 JSON 结构中。我有这一切工作,但我想实现线程(或某种方式)以异步进行 HTTP 调用,而不是连续进行。我将如何在以下代码中实现线程:

    ids = (JSONArray) jsonIn.get("IDs");    

    MyClass myClass = null;
    List<MyClass> myClassList = new ArrayList<MyClass>();

    for (int i = 0; i < ids.size(); i++) {
        JSONObject p = (JSONObject)ids.get(i);
        id = p.get("ID").toString();

        //The HttpUrlConnection call is made in the getResponse() method
        Gson gson = new Gson();
        MyClassResponse result = gson.fromJson(getResponse(),
                MyClassResponse.class);

        for (int x = 0; x < result.ids[0].id.length; x++) {

            myClass = new MyClass();

            myClass.setStringOne(result.ids[0].fieldOne);
            myClass.setStringTwo(result.ids[0].fieldTwo);

            myClassList.add(x, myClass);
        }           
    }

    Gson gsonOut = new Gson();
    String jsonString = gsonOut.toJson(myClassList);

    JsonArray jsonArray = new JsonParser().parse(jsonString).getAsJsonArray();

    JSONObject response = new JSONObject();
    response.put("CustomStructure", jsonArray);

    //pass back custom JSON body
4

2 回答 2

0

使用这个逻辑:

  • 创建一个 Runnable 执行您的循环正在执行的操作,构造函数将单个 JSONObject 作为输入。
  • 将输出 MyClassResponse 作为成员变量存储在可运行文件中。
  • 在循环外声明线程列表和 Runnable 列表
  • 在循环内创建线程和可运行并将其添加到列表中
  • 在循环内启动线程
  • 在线程列表中的每个线程上循环调用 Thread.join 之后(这使得该线程等待线程完成。)
  • 在所有连接语句返回后,从可运行列表中创建您的 MyClassList
于 2013-07-24T02:02:44.370 回答
0

这就是我实现它的方式:

/***Code to execute threads***/
Thread[] threads = new Thread[ids.size()];

for (int i = 0; i < ids.size(); i++) {
    JSONObject p = (JSONObject)id.get(i);
    id = p.get("ID").toString();

    threads[i] = new Thread(new DoThread(id));
    threads[i].start();
}

for(int i = 0; i < id.size(); i++) {
    threads[i].join();
}
/*****************************/

public class DoThread implements Runnable {

    private String id;
    public DoThread(String id) {
        this.id = id;
    }

    public void run() {

        //Do Work   

    }
}
于 2013-07-24T13:07:38.700 回答