Partition d'un Ensemble en sous-ensembles plus petits et les processus de lot
J'ai continu thread en cours d'exécution dans ma Demande , qui se compose d'un HashSet pour stocker tous les symboles à l'intérieur de l'Application .
Conformément à la conception, à l'époque où il fut écrit , à l'intérieur du Thread tandis que la condition est vérifiée, il réitérera le hashset continosly et les mises à jour de la Base de données pour tous les symboles contenus à l'intérieur de HashSet .
Max symboles qui pourraient être présents à l'intérieur de la hashset sera d'environ 6000 .
Je n'ai pas la db avec tous les 6000 symboles à la fois , mais de diviser ce hashset en différents sous-ensembles de 500 (12 ) et la réalisation de chaque sous-ensemble, individuellement et ont un Fil de sommeil après chaque sous-ensemble de 15 minutes , de sorte que je peux réduire la pression sur la Base de données .
C'est mon code (exemple de l'extrait de code )
Comment puis-je Partition d'un Ensemble en sous-ensembles plus petits et des processus , ( j'ai vu des exemples pour partioning ArrayList , TreeSet , mais ne trouve aucun exemple lié à HashSet )
package com.ubsc.rewji.threads;
import java.util.Arrays;
import java.util.Collections;
import java.util.HashSet;
import java.util.Iterator;
import java.util.Set;
import java.util.concurrent.PriorityBlockingQueue;
public class TaskerThread extends Thread {
private PriorityBlockingQueue<String> priorityBlocking = new PriorityBlockingQueue<String>();
String symbols[] = new String[] { "One", "Two", "Three", "Four" };
Set<String> allSymbolsSet = Collections
.synchronizedSet(new HashSet<String>(Arrays.asList(symbols)));
public void addsymbols(String commaDelimSymbolsList) {
if (commaDelimSymbolsList != null) {
String[] symAr = commaDelimSymbolsList.split(",");
for (int i = 0; i < symAr.length; i++) {
priorityBlocking.add(symAr[i]);
}
}
}
public void run() {
while (true) {
try {
while (priorityBlocking.peek() != null) {
String symbol = priorityBlocking.poll();
allSymbolsSet.add(symbol);
}
Iterator<String> ite = allSymbolsSet.iterator();
System.out.println("=======================");
while (ite.hasNext()) {
String symbol = ite.next();
if (symbol != null && symbol.trim().length() > 0) {
try {
updateDB(symbol);
} catch (Exception e) {
e.printStackTrace();
}
}
}
Thread.sleep(2000);
} catch (Exception e) {
e.printStackTrace();
}
}
}
public void updateDB(String symbol) {
System.out.println("THE SYMBOL BEING UPDATED IS" + " " + symbol);
}
public static void main(String args[]) {
TaskerThread taskThread = new TaskerThread();
taskThread.start();
String commaDelimSymbolsList = "ONVO,HJI,HYU,SD,F,SDF,ASA,TRET,TRE,JHG,RWE,XCX,WQE,KLJK,XCZ";
taskThread.addsymbols(commaDelimSymbolsList);
}
}
OriginalL'auteur Pawan | 2013-10-17
Vous devez vous connecter pour publier un commentaire.
Faire quelque chose comme
Maintenant, vous avez partitionné le
originalSet
dans 12 autres HashSets.Probablement pas la meilleure solution pour son problème, mais l'idée est bonne.
Puis-je savoir quelle serait la bonne idée serait de partir de votre point de vue ??
Voir ma réponse juste en dessous de celui-ci. 😉
Pashazadeh , la solution que vous avez fourni a l'air bien . Je vous remercie beaucoup .
OriginalL'auteur Amir Pashazadeh
Avec Goyave:
OriginalL'auteur Andrey Chaschev
Nous pouvons utiliser l'approche suivante pour diviser un Ensemble.
Nous allons obtenir la sortie en
[a, b]
[c, d]
[e]`
OriginalL'auteur PipoTells
Un moyen très simple pour votre problème serait de changer votre code comme suit:
Une méthode générale serait d'utiliser l'itérateur de prendre les éléments un par un dans une simple boucle:
Vous n'avez pas à, mais si vous ne vous sentez pas que vous auriez à prendre note de votre liste actuelle de la position d'une autre manière. Le problème, c'est que le prochain appel de ce code ne doit pas créer une sous-liste avec le de nouveau les éléments.
OriginalL'auteur TwoThe