0

benötigen unterschiedliche Gedanken über unten Szenario Liste 5 dto Objekte zu verarbeiten, ein ResultSet Objekt aus Statement ‚s got assume execute() Methode Diese ResultSet Objekt Tausende von Datensätzen enthalten, hier bin ich zu aktualisieren die einzelnen ResultSet Objektdaten in ein DTO-Objekt. wie ein Multi-Threading anwenden bei atime

Haben die List<MyDTO> myDTOList, jetzt möchte ich jedes DTO in einem Thread und zu einer Zeit maximal 5 Threads, d. H. 5 DTO-Objekte verarbeiten.

(Restliche DTOs sollten warten, um mindestens eine Thread-Ausführung abzuschließen, wenn ein Thread seinen Job beendet, möchte er einen weiteren Thread hinzufügen, so dass wieder 5 Threads ausgeführt werden. Der Prozess wird für alle DTO-Objekte fortgesetzt) ​​

Welche Möglichkeiten gibt es, um diese Art von Anforderung zu implementieren?

Vielen Dank im Voraus für Ihre Zeit und Anregungen.

+0

Dies ist eine Sache wie Echtzeit-Szenario von ATM-Maschinen, gibt es 5 ATM-Maschinen sind im Inneren, aber Hunderte von Benutzern warten darauf zuzugreifen. aber zu einer Zeit können nur 5 zugreifen. – user3682520

Antwort

0

Verwenden

public class YourTask implements Callable<String> { 

//Ctor 
YourTask(data) { 
    // save data in member variables 
} 

public String call() throws Exception { 
    // Process data 
    // return string 

} 

} 

ExecutorService threadPool = Executors.newFixedThreadPool(5); 
List<java.util.concurrent.Future<String>> futures = new ArrayList<Future<String>>(); 


for (your data) { 
    futures.add(threadPool.submit(new YourTask(pass_data))); 
} 

// Wait for threads to finish i.e. join them 
for (Future<String> f :futures){ 
     try { 
      String c = f.get(); 
      doneCount++; 

     } catch (InterruptedException e) { 
      // 
     } catch (ExecutionException e) { 
      // 
     } 
      } 
+0

perfekt .. danke .. nach getan mit allen Threads der Controller kommt nicht aus dem Programm, nee, etwas dafür zu setzen? – user3682520

+0

if (doneCount == testDTOList.size()) { \t \t System.out.println ("Fertig mit allen Threads ..."); \t \t System.exit (0); \t} – user3682520

+0

gehalten, dass in for-Schleife, ist das in Ordnung, um den Controller zu stoppen? – user3682520

0

ExecutorService mit einem festen Thread-Pool ist speziell für solche Aufgaben:

// Task that will process DTOs 
public class DTOTask implements Callable<Void> { 
    private MyDTO obj; 

    public DTOTask(MyDTO obj) { 
     this.obj = obj; 
    } 

    @Override 
    public Void call() { 
     // Process obj here 
    }; 
} 

ExecutorService executor = Executors.newFixedThreadPool(5); 

Future<?> future = executor.submit(new DTOTask(myDObject)); 

Sie future s nutzen können Aufgaben abbrechen, für ihre Fertigstellung warten, Abruf- Ergebnisse und tun andere Dinge.