[FIXED] Rückgabewerte von Java-Threads

Ausgabe

Ich habe einen Java-Thread wie den folgenden:

   public class MyThread extends Thread {
        MyService service;
        String id;
        public MyThread(String id) {
            this.id = node;
        }
        public void run() {
            User user = service.getUser(id)
        }
    }

Ich habe ungefähr 300 IDs und alle paar Sekunden starte ich Threads, um einen Anruf für jede der IDs zu tätigen. Z.B.

for(String id: ids) {
    MyThread thread = new MyThread(id);
    thread.start();
}

Jetzt möchte ich die Ergebnisse von jedem Thread sammeln und eine Stapeleinfügung in die Datenbank durchführen, anstatt alle 2 Sekunden 300 Datenbankeinfügungen vorzunehmen.

Irgendeine Idee, wie ich das bewerkstelligen kann?

Lösung

Wenn Sie alle Ergebnisse sammeln möchten, bevor Sie die Datenbankaktualisierung durchführen, können Sie die invokeAllMethode verwenden. Dies kümmert sich um die Buchhaltung, die erforderlich wäre, wenn Sie Aufgaben einzeln einreichen, wie Daveb vorschlägt.

private static final ExecutorService workers = Executors.newCachedThreadPool();

...

Collection<Callable<User>> tasks = new ArrayList<Callable<User>>();
for (final String id : ids) {
  tasks.add(new Callable<User>()
  {

    public User call()
      throws Exception
    {
      return svc.getUser(id);
    }

  });
}
/* invokeAll blocks until all service requests complete, 
 * or a max of 10 seconds. */
List<Future<User>> results = workers.invokeAll(tasks, 10, TimeUnit.SECONDS);
for (Future<User> f : results) {
  User user = f.get();
  /* Add user to batch update. */
  ...
}
/* Commit batch. */
...


Beantwortet von –
erickson


Antwort geprüft von –
Mary Flores (FixError Volunteer)

0 Shares:
Leave a Reply

Your email address will not be published. Required fields are marked *

You May Also Like