CountDownLatch
ist eine Multithread-Synchronisierungstoolklasse. In einer Multithread-Umgebung können mehrere Threads warten, bis die Ausführung des vorherigen Threads endet. Dem Klassennamen nach zu urteilen bedeutet CountDown
das Dekrementieren der Zahl, sodass wir es als Zähler verstehen können. CountDownLatch
是一个多线程同步工具类,在多线程环境中它允许多个线程处于等待状态,直到前面的线程执行结束。从类名上看CountDown
既是数量递减的意思,我们可以把它理解为计数器。
countDown()
:计数器递减方法。
await()
:使调用此方法的线程进入等待状态,直到计数器计数为0时主线程才会被唤醒。
await(long, TimeUnit)
:在await()
方法的基础上增加了超时策略,若等待超时仍未有结果则会直接唤醒主线程运行。
在这里我们用一段简单的代码进行演示:
@Slf4j public class CountDownLatchDemo { public static void main(String[] args) throws InterruptedException { CountDownLatch countDownLatch = new CountDownLatch(3); new Thread(() -> { log.info("hello this is thread one"); try { TimeUnit.SECONDS.sleep(1); } catch (InterruptedException e) { e.printStackTrace(); } countDownLatch.countDown(); }).start(); new Thread(() -> { log.info("hello this is thread two"); countDownLatch.countDown(); }).start(); new Thread(() -> { log.info("hello this is thread three"); countDownLatch.countDown(); }).start(); countDownLatch.await(); log.info("say good bye!"); } }
由上面的代码可见,我们创建了一个CountDownLatch
计数器为3和三个线程同步运行。在main主线程中调用了countDownLatch.await()
方法使主线程进入阻塞。其中三个线程任务执行完毕后都会调用countDownLatch.countDown()
方法对计数器进行递减,当三个线程任务都执行完毕后计数器计数值为0时主线程被唤醒。
注:在创建
CountDownLatch
实例时必须定义计数器值,一般相对较合理的用法是该值的定义需要经过合理的计算使计数值与需要并行的线程数相等,在每个线程执行完成后做计数递减,最终唤醒主线程继续执行。
CountDownLatch
计数值设置大于线程数,那么最终所有线程都执行完了,而计数为递减到0那么主线程将会一直处于等待状态。
CountDownLatch
计数值设置小于并发线程数,那么可能在部分线程未执行完毕时,计数就已经递减到0,则主线程会被提前唤醒。
如下图,主线程阻塞与唤醒的核心就是计数器,只有当所有线程执行完成计数逐个递减最终才会唤起await()
阻塞中的主线程。
注:
await()
可以阻塞一个线程,也可以阻塞多个线程,如果是阻塞多个线程,那么在计数为0时将会唤醒所有被阻塞的线程。
在简单了解完CountDownLatch
的作用后,相信各位最终目的还是想了解如何去使用,在哪些场景下使用更加合适,接下来我就拿一个对账业务的场景详细分析一下。
在当前的情况下,许多平台会与银联、微信、支付宝等支付渠道对接交易,因此无法避免进行对账。对账通常都会在每日的凌晨去处理,一方面是凌晨时间点多数平台访问量都会较小,服务器压力也比较轻松,而且此时出账也比较合理,所以在这个时间点做对账也是一个大数据量计算的操作。
上面讲这么多好像都没说到重点,在处理对账之前首先我们肯定是需要通过各个支付渠道获取对账单文件,那么该如何操作呢?
对账文件下载(第一阶段):在这种情况下可以设计三个任务并发去获取对账文件,使用CountDownLatch
阻塞主线程,等待三个任务都获取到文件的时候做计数递减,最终唤醒主线将标记本阶段处理完成,并发起进入下一阶段的通知。
对账文件解析(第二阶段):在上个阶段已下载完成的文件文件中,此阶段要做的就是解析文件。由于三个渠道都是不同的厂家那么文件的内容格式肯定都是不一样的,这时候我们又可以使用CountDownLatch
countDown()
: Zählerdekrementierungsmethode. 🎜await()
: Versetzt den Thread, der diese Methode aufruft, in einen Wartezustand. Der Hauptthread wird erst aktiviert, wenn der Zähler auf 0 zählt. 🎜await(long, TimeUnit)
: Eine Timeout-Strategie wird basierend auf der Methode await()
hinzugefügt, wenn nach dem Warten kein Ergebnis vorliegt Bei Zeitüberschreitung wird der Hauptthread direkt zur Ausführung aktiviert. 🎜CountDownLatch
Der Zähler ist 3 und die drei Threads laufen gleichzeitig. Die Methode countDownLatch.await()
wird im Hauptthread aufgerufen, um eine Blockierung des Hauptthreads zu bewirken. Nachdem drei Thread-Aufgaben ausgeführt wurden, wird die Methode countDownLatch.countDown()
aufgerufen, um den Zähler zu verringern. Wenn alle drei Thread-Aufgaben ausgeführt werden, erreicht der Zählerwert 0 und der Haupt-Thread wird aktiviert. 🎜🎜Hinweis: Der Zählerwert muss beim Erstellen einer CountDownLatch
-Instanz definiert werden. Im Allgemeinen besteht eine relativ sinnvolle Verwendung darin, dass die Definition des Werts eine angemessene Berechnung erfordert Machen Sie den Zählwert Es entspricht der Anzahl der Threads, die parallelisiert werden müssen. Nachdem die Ausführung jedes Threads abgeschlossen ist, wird die Anzahl verringert und schließlich wird der Hauptthread aktiviert, um die Ausführung fortzusetzen. 🎜
CountDownLatch
Wenn der Zählwert so eingestellt ist, dass er größer als die Anzahl der Threads ist, werden es schließlich alle Threads sein ausgeführt und die Anzahl sinkt auf 0. Dann befindet sich der Hauptthread immer im Wartezustand. 🎜CountDownLatch
Wenn der Zählwert auf weniger als die Anzahl gleichzeitiger Threads eingestellt ist, wurde der Zähler möglicherweise auf 0 dekrementiert, bevor einige Threads die Ausführung abgeschlossen haben, und Der Hauptthread wird früh geweckt. 🎜await()
Hauptthread blockiert. 🎜🎜Hinweis: await()
kann einen oder mehrere Threads blockieren. Wenn mehrere Threads blockiert sind, wird es aktiviert, wenn die Anzahl 0 erreicht Alle blockierten Threads. 🎜
🎜 🎜🎜Szenarien verwenden🎜🎜Nachdem Sie die Funktion von CountDownLatch
kurz verstanden haben, glaube ich, dass Ihr ultimatives Ziel darin besteht, zu verstehen, wie man es verwendet und in welchen Szenarien es angemessener ist, es zu verwenden. Als Nächstes , Ich werde ein Versöhnungsgeschäft übernehmen Lassen Sie uns das Szenario im Detail analysieren. 🎜🎜Unter den aktuellen Umständen werden viele Plattformen Transaktionen mit Zahlungskanälen wie UnionPay, WeChat und Alipay verknüpfen, sodass ein Abgleich unvermeidlich ist. Abstimmungen werden in der Regel am frühen Morgen eines jeden Tages bearbeitet. Einerseits haben die meisten Plattformen in den frühen Morgenstunden kleinere Besuche, und der Serverdruck ist relativ entspannt, und die Konten sind zu dieser Zeit angemessener Es ist auch angebracht, den Abgleich zu diesem Zeitpunkt durchzuführen. Ein großer Datenmengenberechnungsvorgang. 🎜🎜Es scheint, dass keiner der oben genannten Punkte erwähnt wurde. Bevor wir den Abgleich durchführen, müssen wir zunächst die Abrechnungsdateien über verschiedene Zahlungskanäle erhalten. 🎜CountDownLatch
drei Threads starten, um ihre jeweiligen Abgleichsdateien und schließlich den Dateiinhalt zu analysieren wird in das vom Unternehmen benötigte einheitliche Datenformat konvertiert und in der Datenbank gespeichert. Nachdem alle drei Aufgaben in der Datenbank gespeichert wurden, wird der Hauptthread aktiviert und als abgeschlossen markiert, wodurch die nächste Phase mit der Arbeit begonnen wird. 🎜Abstimmung und Abrechnung (dritte Phase) : Nachdem die Dateneingabe in der vorherigen Phase abgeschlossen ist, muss in dieser Phase ein Vergleich durchgeführt werden Ob eine Transaktion korrekt ist oder nicht, wird im Allgemeinen durch Vergleich des Transaktionsbetrags mit der Bestellnummer und dem Transaktionskanal bestimmt. Wenn die Beträge konsistent sind, wird die Transaktion erfolgreich abgewickelt. Andernfalls wird die Transaktion als abnormale Transaktion beurteilt und gespeichert das Lager zur Bearbeitung. Aus der obigen Prozessanalyse können wir ein relativ vernünftiges CountDownLatch
计数,结合Semaphore
Semaphor entwerfen, um die Parallelität zu steuern und die Vergleichstransaktionsaufträge gleichzeitig zu verarbeiten. Nachdem alle Transaktionsaufträge verarbeitet wurden, aktivieren wir schließlich den Hauptthread, um den Abgleich zu markieren und zu benachrichtigen Die nächste Abrechnung erfolgt stufenweise.
Ausgabe (vierte Stufe) : Normalerweise erstellt die Plattform Konten, nachdem der Abgleich abgeschlossen ist, d. h. gemäß der Das Geschäft der Plattform Die Regeln erlassen relevante Rechnungen, um Finanzpersonal die Erstellung von Statistiken zu erleichtern.
Das obige ist der detaillierte Inhalt vonSo verwenden Sie die Java-Multithread-Synchronisierungstool-Klasse CountDownLatch. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!