/ / Nicht alle Java-Threads starten - Java, Multithreading, Java-ee

Nicht alle Java-Threads starten - Java, Multithreading, Java-ee

Ich habe eine große Anzahl von Datensätzen in der Oracle-Datenbankdass einige Operationen für sie durchgeführt werden sollten. Die Anwendung erhält 4 Parameter als Eingabe. Sie sind "Bereich von", "Bereich bis", "Threadanzahl" und "Blockgröße". Mithilfe dieser Parameter berechnet die Anwendung, wie viele Datensätze jedem Thread zugewiesen werden sollen. Wenn ein Thread gestartet wird, ruft er Datensätze aus der Datenbank blockSize für blockSize ab, führt einige Operationen aus und speichert die Datensätze in einer anderen Datenbanktabelle. Ich habe die Anwendung mit 10.000 Datensätzen auf einem Computer mit 8 CPU getestet und die Anzahl der Threads auf 8 gesetzt. Es gibt kein Problem. In der realen Umgebung gibt es 1.000.000 Datensätze und 16 CPU. Wenn Sie die Anwendung dort ausführen und die Anzahl der Threads auf 16 oder 12 festlegen, Einige Threads starten nicht. Es gibt keine Fehler- oder Ausnahmemeldung. Sie werden einfach nie angezeigt läuft nicht. Andere Threads starten erfolgreich. Irgendeine Idee?

Unten ist ein Teil des Codes, der Threads vorbereitet:

List list = new ArrayList();
Object[] records;

int allIDsSize = to - from + 1;

int segmentSize = Math.round(allIDsSize % threadsCount == 0 ? allIDsSize / threadsCount : allIDsSize / threadsCount + 1);

Semaphore semaphore = new Semaphore(0);

List<Future> threads = new ArrayList<Future>();
int k = 0;
while (k * segmentSize < allIDsSize) {
int from2 = segmentSize * k + 1;

int to2;
if (from2 + segmentSize - 1 < allIDsSize) {
to2 = from2 + segmentSize - 1;
} else {
to2 = allIDsSize;
}

k++;

MyThread thread = new MyThread(from + from2 - 1, from + to2 - 1, semaphore); //MyThread implements Callable<String>

if (log.isInfoEnabled()) {
log.info(String.format("Thread IDs are from %d to %d", (from + from2 - 1), (from + to2 - 1)));
log.info("thread started " + k);
}

Future<String> future = pool.submit(thread);
threads.add(future);
}

semaphore.acquire(threads.size());

Vielen Dank.

Solmaz.

Antworten:

0 für die Antwort № 1

Es ist wahrscheinlich der Fall, dass einige Threads beendet werdenBevor alle Aufgaben an die Executor-Warteschlange gesendet wurden und der Executor-Service folglich nicht die maximale Anzahl von Threads erstellen muss (der feste Thread-Pool erstellt nach Bedarf bis zum Limit neue Threads, erstellt nicht alle Threads gleichzeitig). .

Als Randnotiz: Es ist verwirrend, dass Sie die verwenden Faden Konzept (thread und MyThread) für etwas, das wirklich ein ist Aufgabe, (d.h. Runnableoder Callable).