2013-07-23 2 views
0

У меня есть специальный сервисный модуль, в котором я передаю тело JSON, содержащее массив идентификаторов. Я должен повторить эти идентификаторы и сделать отдельный вызов веб-службы с каждым идентификатором, чтобы получить тело ответа, а затем объединить эти ответы в пользовательскую структуру JSON. У меня есть все работающие, но я бы хотел реализовать потоки (или некоторые их способы), чтобы сделать HTTP-вызовы асинхронно, а не последовательно. Как бы я реализую резьб в следующем коде:Java - Threading HttpUrlConnection вызывает

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 
+0

Я попытался я использовать Runnable, но моя путаница заключается в том, где ставить/начала резьбы (внутри или вне цикла) или я не уверен, если есть другой способ для использования это более подходит для асинхронных HTTP-вызовов. – bgeveritt

ответ

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 

    } 
} 
0

Используйте эту логику:

  • Создать Runnable, который делает то, что ваш цикл делает, конструктор принимает индивидуальный JSONObject в качестве входных данных.
  • Сохраните вывод MyClassResponse как переменную-член в вашей runnable.
  • Есть список потоков и список Runnable объявлен вне цикла
  • Создать нить и работоспособную внутри цикла и добавить его в списки
  • запустить поток внутри цикла
  • После вызова петли Thread .join на каждом из потоков в списке потоков (Это делает эту тему ждать, пока нити будут завершены.)
  • создать MyClassList из списка runnables раз все присоединиться заявления вернулись назад