Ich versuche Multithreading zu verwenden, um einen großen Block der Verarbeitung von Daten in kleinere Stücke zu zerlegen.
Das Problem, das ich habe, ist, dass meine Threads nicht gegen ihren angegebenen Teil des Datenbereichs laufen.Java-Thread-Instanziierung mit falschen Variablen
Zum Beispiel:
Thread-2 soll Bereich von 0 verarbeiten - 1000
faden 3 Bereich von 1001 verarbeitet werden soll - 2000
Als ich meine neuen nennen Threads Rücken an Rücken bekomme ich:
thread-2 = 0-1000
fade 3 = 0 - 1000
Wenn ich einen Thread sleep(3000)
zwischen den beiden Fäden Anrufe hinzufügen i erhalten:
faden 2 = 0-1000
fade 3 = 0 - 2000
ich bin mir nicht sicher, was ich falsch mache und würde wirklich apprec Iate einige Anleitung.
Hinweis auf snippits unten, abgekürzt I den obigen Zahlen tatsächlichen Anrufbereich in Beispiel unten
ist1.000.000 - 1.001.000 und 1.001.001 - 1.002.000
Schnipsel aus dem Hauptverfahren Detaillierung Faden Call:
try {
int start = 1000000;
int end = 1001000;
new Thread(new MyThread(start, end, PUBLIC_INVALID_LIST)).start();
Thread.sleep(3000);
start = 1001001;
end = 1002000;
new Thread(new MyThread(start, end, PUBLIC_INVALID_LIST)).start();
} catch (InterruptedException ex) {
Thread.currentThread().interrupt();
}
Snippet von MyThread das ThemaerstrecktDiese Details, wie ich params vom Hauptverfahren bis zur run()
Methode bin vorbei:
//variables to pass from constructor to run()
private int startIndex;
private int endIndex;
private ArrayList PUBLIC_INVALID_LIST;
MyThread(int startIndex, int endIndex, ArrayList PUBLIC_INVALID_LIST) {
this.startIndex = startIndex;
this.endIndex = endIndex;
this.PUBLIC_INVALID_LIST = PUBLIC_INVALID_LIST;
}//end of initializer
public void run() {
gut aus, was man sich vorstellen kann ich geschrieben habe, dass 'MyThread' die Dinge im Inneren des wandelbaren' Arraylist PUBLIC_INVALID_LIST' wird Neuordnungs wenn Sie anrufen 'Thread.start()'. Wenn Sie schreiben könnten, wie der Thread die Daten des Arraylisten manipuliert. macht aber wieder keinen Sinn, dass mit 'Thread.sleep()' richtig funktioniert. Zerlegen Sie die Liste auch mit der Methode 'list_List (from, to)', anstatt die gesamte Liste zu übergeben. – AntJavaDev
@AntJavaDev Das Ziel des Programms ist es, eine Liste von Pfaden zu durchsuchen und diejenigen zu identifizieren, die nicht mehr existieren. Jeder Pfad, der nicht mehr existiert, hat seine Pfad-ID über SP in eine Tabelle geschrieben. 'ArrayList PUBLIC_INVALID_LIST' ist die Rückgabe einer SQL-Abfrage, um alle zuvor beobachteten Pfade abzurufen, die vor dem Start der Threads nicht mehr existieren, und wird nicht von den Threads geändert.Jeder Thread führt seine eigene SQL-Abfrage aus, um path_ids im Bereich startIndex bis endIndex abzurufen. Und filtert dann die Liste, um irgendeine path_id in 'PUBLIC_INVALID_LIST' zu entfernen. – BigDerpa
Ich sehe nichts, das in dem Code auffällt, den du bisher geteilt hast. Wenn Sie mehr von Ihrem Code teilen könnten, wie die 'run'-Methode Ihrer' MyThread'-Klasse, wäre das hilfreich. Gibt es einen Grund dafür, dass Sie Ihre Daten nicht einfach in einer Warteschlange speichern und Elemente während der Verarbeitung abreißen? –