CountDownLatch
ialah kelas alat penyegerakan berbilang benang Dalam persekitaran berbilang benang, ia membenarkan berbilang utas menunggu sehingga pelaksanaan urutan sebelumnya tamat. Jika dilihat dari nama kelas, CountDown
bermaksud kuantiti berkurangan, jadi kita boleh memahaminya sebagai pembilang.
countDown()
: Kaedah pengurangan balas.
await()
: Meletakkan benang yang memanggil kaedah ini ke dalam keadaan menunggu Benang utama tidak akan dibangkitkan sehingga kaunter mencapai 0.
await(long, TimeUnit)
: Strategi tamat masa ditambah berdasarkan kaedah await()
Jika tiada hasil selepas menunggu tamat masa, urutan utama akan dibangkitkan terus untuk dijalankan.
Di sini kami menggunakan kod mudah untuk menunjukkan:
@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!"); } }
Seperti yang dapat dilihat dari kod di atas, kami mencipta pembilang CountDownLatch
dengan nilai 3 dan tiga utas berjalan serentak. Kaedah countDownLatch.await()
dipanggil dalam utas utama untuk menyebabkan utas utama memasuki penyekatan. Selepas tiga tugasan utas dilaksanakan, kaedah countDownLatch.countDown()
akan dipanggil untuk mengurangkan pembilang Apabila ketiga-tiga tugasan utas dilaksanakan, nilai pembilang mencapai 0 dan utas utama dibangkitkan.
Nota: Nilai balas mesti ditakrifkan semasa mencipta tika
CountDownLatch
Secara amnya, penggunaan yang agak munasabah ialah takrifan nilai perlu dikira secara munasabah bahawa nilai kiraan sepadan dengan yang diperlukan Bilangan utas selari adalah sama Selepas pelaksanaan setiap utas selesai, kiraan dikurangkan, dan akhirnya utas utama dibangunkan untuk meneruskan pelaksanaan.
CountDownLatch
Jika nilai kiraan ditetapkan menjadi lebih besar daripada bilangan utas, maka semua utas akhirnya akan dilaksanakan, dan jika kiraan berkurangan kepada 0, utas utama akan sentiasa dalam keadaan menunggu.
CountDownLatch
Jika nilai kiraan ditetapkan kepada kurang daripada bilangan utas serentak, maka kiraan itu mungkin telah dikurangkan kepada 0 sebelum beberapa utas telah selesai melaksanakan, dan yang utama benang akan dikejutkan lebih awal.
Seperti yang ditunjukkan di bawah, teras benang utama menyekat dan bangun ialah kaunter Hanya apabila semua utas telah selesai dilaksanakan dan kiraan adalah dikurangkan satu persatu akhirnya akan terjagaawait()
Benang utama tersekat.
Nota:
await()
boleh menyekat satu utas atau berbilang utas Jika berbilang utas disekat, semua utas akan dibangkitkan apabila kiraan mencecah 0. Urutan yang disekat.
Setelah memahami secara ringkas fungsi CountDownLatch
, saya percaya matlamat utama anda adalah untuk memahami cara menggunakannya dan di mana Adalah lebih sesuai untuk menggunakannya dalam senario ini Seterusnya, saya akan mengambil senario perniagaan perdamaian dan menganalisisnya secara terperinci.
Dalam keadaan semasa, banyak platform akan menghubungkan transaksi dengan saluran pembayaran seperti UnionPay, WeChat dan Alipay, jadi penyelarasan tidak dapat dielakkan. Penyesuaian biasanya diproses pada awal pagi setiap hari Di satu pihak, kebanyakan platform mempunyai lawatan yang lebih kecil pada waktu awal pagi, dan tekanan pelayan agak santai, dan akaun lebih munasabah pada masa ini, jadi ia juga. sesuai untuk melakukan rekonsiliasi pada masa ini Operasi pengiraan volum data yang besar.
Banyak perkara yang telah dinyatakan di atas nampaknya telah terlepas daripada tujuan Sebelum memproses perdamaian, kita mesti terlebih dahulu mendapatkan fail penyata melalui pelbagai saluran pembayaran.
Muat turun fail perdamaian (fasa pertama) : Dalam kes ini, tiga tugas boleh direka bentuk untuk mendapatkan fail perdamaian secara serentak, menggunakan CountDownLatch
menyekat Urutan utama menunggu untuk ketiga-tiga tugasan untuk mendapatkan fail dan mengurangkan kiraan Akhirnya, membangkitkan utas utama akan menandakan selesainya peringkat pemprosesan ini dan memulakan pemberitahuan untuk memasuki peringkat seterusnya.
Penghuraian fail rekonsiliasi (fasa kedua) : Dalam fail yang telah dimuat turun pada peringkat sebelumnya, apa yang perlu dilakukan dalam peringkat ini ialah menghuraikan fail. Memandangkan tiga saluran adalah daripada pengeluar yang berbeza, format kandungan fail mestilah berbeza Pada masa ini, kami boleh menggunakan CountDownLatch
untuk memulakan tiga utas untuk menghuraikan fail penyesuaian masing-masing, dan akhirnya menukar kandungan fail kepada perniagaan yang diperlukan. data dimasukkan ke dalam pangkalan data dalam format bersatu Selepas ketiga-tiga tugasan dimasukkan ke dalam pangkalan data, utas utama dibangkitkan dan ditanda sebagai selesai, memberitahu peringkat seterusnya untuk memulakan kerja.
Rekonsiliasi dan penyelesaian (fasa ketiga) : Selepas kemasukan data dalam fasa sebelumnya selesai, apa yang perlu dilakukan dalam fasa ini ialah membandingkan sama ada setiap transaksi adalah tepat . Secara amnya, amaun urus niaga dibandingkan berdasarkan nombor pesanan dan saluran urus niaga Jika jumlahnya konsisten, urus niaga itu berjaya diselesaikan. Berdasarkan analisis proses di atas, kita boleh mereka bentuk kiraan CountDownLatch
yang agak munasabah, menggabungkannya dengan Semaphore
semaphore untuk mengawal konkurensi dan memproses pesanan transaksi perbandingan secara serentak, dan akhirnya membangkitkan utas utama selepas semua pesanan transaksi selesai. diproses untuk menandakan penyelarasan selesai , dan memberitahu peringkat seterusnya untuk mengeluarkan akaun.
Mengeluarkan akaun (peringkat keempat): Biasanya platform akan mengeluarkan akaun selepas perdamaian selesai, iaitu mudah untuk mengeluarkan bil yang berkaitan mengikut peraturan perniagaan platform Kakitangan Kewangan melaksanakan statistik.
Atas ialah kandungan terperinci Cara menggunakan kelas alat penyegerakan berbilang benang Java CountDownLatch. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!