Es gibt eine einfache Möglichkeit, dieses Problem zu lösen, wenn Sie berücksichtigen, dass die Gesamtzahl der Elemente von Thread A verarbeitet und die Summe durch Gewinde B verarbeitet Elemente werden am Ende auf die Menge der Elemente in der gleich Liste.
Wenn Sie also einen Zähler haben, der jedes Mal dekrementiert, wenn ein Thread das nächste Element verarbeiten möchte, wissen Sie, dass Sie fertig sind, sobald der Zähler Null erreicht.
public class MyThreadSyncer {
protected final AtomicInteger elementCount;
public MyThreadSyncer(final Collection c) {
elementCount = new AtomicInteger(c.size());
}
public boolean canProcessNext() {
return (this.elementCount.decrementAndGet() >= 0);
}
}
diese Klasse Mit jedem Thread über einen eigenen Zähler setzt (Thread A bei 0, Gewinden B bei Größe-1) und prüft dann wie folgt aus:
if (this.threadSyncer.canProcessNext()) {
this.theTasks[this.myPosition].process();
this.myPosition += 1; // this line in thread A
this.myPosition -= 1; // this line in thread B
}
was bedeuten u ', wie man lesen aus derselben Liste? eine Referenz der Liste an beide Threads übergeben? – Yazan
Bearbeiten die Threads die Liste? Wie genau muss das Stoppen sein? Wenn beispielsweise die Threads nach der Überschneidung ein paar weitere Elemente lesen, wäre das schlecht? –
@ThijsSteel, Es werden keine Themen aus der Liste angezeigt. Ja, es ist schlecht, nach der Überschneidung Objekte zu lesen. Ziel ist es also, die ganze Liste zu lesen, aber von verschiedenen Enden ohne zu intervenieren. – Rogger296