{"id":23246,"date":"2024-03-16T01:04:22","date_gmt":"2024-03-16T01:04:22","guid":{"rendered":"https:\/\/www.silicloud.com\/blog\/understanding-and-utilizing-countdownlatch\/"},"modified":"2024-03-22T00:48:33","modified_gmt":"2024-03-22T00:48:33","slug":"understanding-and-utilizing-countdownlatch","status":"publish","type":"post","link":"https:\/\/www.silicloud.com\/blog\/understanding-and-utilizing-countdownlatch\/","title":{"rendered":"Understanding and utilizing CountDownLatch."},"content":{"rendered":"<p>CountDownLatch is a concurrency utility class in Java that is used to implement the functionality of thread waiting. It allows one or more threads to wait for the completion of operations by other threads before continuing.<\/p>\n<p>CountDownLatch uses a counter to implement waiting. The initial value of the counter can be set to a positive integer, when a thread completes its task, the value of the counter is decreased by 1. When the counter&#8217;s value becomes 0, all waiting threads will be released and can continue execution.<\/p>\n<p>The main methods of CountDownLatch include:<\/p>\n<ol>\n<li>CountDownLatch(int count): Constructor that sets the initial value of the counter.<\/li>\n<li>Await(): It makes the current thread wait until the value of the counter becomes zero.<\/li>\n<li>Decrease the value of the counter by 1 in the countDown function.<\/li>\n<\/ol>\n<p>Here is an example of using CountDownLatch:<\/p>\n<pre class=\"post-pre\"><code><span class=\"hljs-keyword\">import<\/span> java.util.concurrent.CountDownLatch;\r\n\r\n<span class=\"hljs-keyword\">public<\/span> <span class=\"hljs-keyword\">class<\/span> <span class=\"hljs-title class_\">CountDownLatchExample<\/span> {\r\n    <span class=\"hljs-keyword\">public<\/span> <span class=\"hljs-keyword\">static<\/span> <span class=\"hljs-keyword\">void<\/span> <span class=\"hljs-title function_\">main<\/span><span class=\"hljs-params\">(String[] args)<\/span> <span class=\"hljs-keyword\">throws<\/span> InterruptedException {\r\n        <span class=\"hljs-type\">CountDownLatch<\/span> <span class=\"hljs-variable\">latch<\/span> <span class=\"hljs-operator\">=<\/span> <span class=\"hljs-keyword\">new<\/span> <span class=\"hljs-title class_\">CountDownLatch<\/span>(<span class=\"hljs-number\">3<\/span>);  <span class=\"hljs-comment\">\/\/ \u8bbe\u7f6e\u8ba1\u6570\u5668\u7684\u521d\u59cb\u503c\u4e3a3<\/span>\r\n\r\n        <span class=\"hljs-type\">Worker<\/span> <span class=\"hljs-variable\">worker1<\/span> <span class=\"hljs-operator\">=<\/span> <span class=\"hljs-keyword\">new<\/span> <span class=\"hljs-title class_\">Worker<\/span>(latch, <span class=\"hljs-string\">\"Worker1\"<\/span>);\r\n        <span class=\"hljs-type\">Worker<\/span> <span class=\"hljs-variable\">worker2<\/span> <span class=\"hljs-operator\">=<\/span> <span class=\"hljs-keyword\">new<\/span> <span class=\"hljs-title class_\">Worker<\/span>(latch, <span class=\"hljs-string\">\"Worker2\"<\/span>);\r\n        <span class=\"hljs-type\">Worker<\/span> <span class=\"hljs-variable\">worker3<\/span> <span class=\"hljs-operator\">=<\/span> <span class=\"hljs-keyword\">new<\/span> <span class=\"hljs-title class_\">Worker<\/span>(latch, <span class=\"hljs-string\">\"Worker3\"<\/span>);\r\n\r\n        worker1.start();\r\n        worker2.start();\r\n        worker3.start();\r\n\r\n        latch.await();  <span class=\"hljs-comment\">\/\/ \u7b49\u5f85\u6240\u6709\u7ebf\u7a0b\u6267\u884c\u5b8c\u6bd5<\/span>\r\n\r\n        System.out.println(<span class=\"hljs-string\">\"All workers have finished their tasks.\"<\/span>);\r\n    }\r\n}\r\n\r\n<span class=\"hljs-keyword\">class<\/span> <span class=\"hljs-title class_\">Worker<\/span> <span class=\"hljs-keyword\">extends<\/span> <span class=\"hljs-title class_\">Thread<\/span> {\r\n    <span class=\"hljs-keyword\">private<\/span> CountDownLatch latch;\r\n\r\n    <span class=\"hljs-keyword\">public<\/span> <span class=\"hljs-title function_\">Worker<\/span><span class=\"hljs-params\">(CountDownLatch latch, String name)<\/span> {\r\n        <span class=\"hljs-built_in\">super<\/span>(name);\r\n        <span class=\"hljs-built_in\">this<\/span>.latch = latch;\r\n    }\r\n\r\n    <span class=\"hljs-keyword\">public<\/span> <span class=\"hljs-keyword\">void<\/span> <span class=\"hljs-title function_\">run<\/span><span class=\"hljs-params\">()<\/span> {\r\n        <span class=\"hljs-keyword\">try<\/span> {\r\n            Thread.sleep(<span class=\"hljs-number\">1000<\/span>);  <span class=\"hljs-comment\">\/\/ \u6a21\u62df\u4efb\u52a1\u6267\u884c\u65f6\u95f4<\/span>\r\n            System.out.println(getName() + <span class=\"hljs-string\">\" has finished its task.\"<\/span>);\r\n            latch.countDown();  <span class=\"hljs-comment\">\/\/ \u8ba1\u6570\u5668\u7684\u503c\u51cf1<\/span>\r\n        } <span class=\"hljs-keyword\">catch<\/span> (InterruptedException e) {\r\n            e.printStackTrace();\r\n        }\r\n    }\r\n}\r\n<\/code><\/pre>\n<p>In the example above, we created a CountDownLatch object with an initial value of 3. Three Worker threads were then created and assigned tasks. After each Worker thread completes its task, it calls the countDown() method to decrement the counter value. The main thread calls the await() method to wait for the counter value to reach 0, meaning all Worker threads have completed their tasks before the main thread can continue execution.<\/p>\n<p>Please note that the counter of CountDownLatch is one-time use only, once the counter value reaches 0, it cannot be reset to another value. If you need to use the counter multiple times, consider using the CyclicBarrier class.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>CountDownLatch is a concurrency utility class in Java that is used to implement the functionality of thread waiting. It allows one or more threads to wait for the completion of operations by other threads before continuing. CountDownLatch uses a counter to implement waiting. The initial value of the counter can be set to a positive [&hellip;]<\/p>\n","protected":false},"author":5,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_import_markdown_pro_load_document_selector":0,"_import_markdown_pro_submit_text_textarea":"","footnotes":""},"categories":[1],"tags":[],"class_list":["post-23246","post","type-post","status-publish","format-standard","hentry","category-uncategorized"],"yoast_head":"<!-- This site is optimized with the Yoast SEO Premium plugin v21.5 (Yoast SEO v21.5) - https:\/\/yoast.com\/wordpress\/plugins\/seo\/ -->\n<title>Understanding and utilizing CountDownLatch. - Blog - Silicon Cloud<\/title>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/www.silicloud.com\/blog\/understanding-and-utilizing-countdownlatch\/\" \/>\n<meta property=\"og:locale\" content=\"en_US\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Understanding and utilizing CountDownLatch.\" \/>\n<meta property=\"og:description\" content=\"CountDownLatch is a concurrency utility class in Java that is used to implement the functionality of thread waiting. It allows one or more threads to wait for the completion of operations by other threads before continuing. CountDownLatch uses a counter to implement waiting. The initial value of the counter can be set to a positive [&hellip;]\" \/>\n<meta property=\"og:url\" content=\"https:\/\/www.silicloud.com\/blog\/understanding-and-utilizing-countdownlatch\/\" \/>\n<meta property=\"og:site_name\" content=\"Blog - Silicon Cloud\" \/>\n<meta property=\"article:publisher\" content=\"https:\/\/www.facebook.com\/SiliCloudGlobal\/\" \/>\n<meta property=\"article:published_time\" content=\"2024-03-16T01:04:22+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2024-03-22T00:48:33+00:00\" \/>\n<meta name=\"author\" content=\"Emily Johnson\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:creator\" content=\"@SiliCloudGlobal\" \/>\n<meta name=\"twitter:site\" content=\"@SiliCloudGlobal\" \/>\n<meta name=\"twitter:label1\" content=\"Written by\" \/>\n\t<meta name=\"twitter:data1\" content=\"Emily Johnson\" \/>\n\t<meta name=\"twitter:label2\" content=\"Est. reading time\" \/>\n\t<meta name=\"twitter:data2\" content=\"2 minutes\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\/\/www.silicloud.com\/blog\/understanding-and-utilizing-countdownlatch\/#article\",\"isPartOf\":{\"@id\":\"https:\/\/www.silicloud.com\/blog\/understanding-and-utilizing-countdownlatch\/\"},\"author\":{\"name\":\"Emily Johnson\",\"@id\":\"https:\/\/www.silicloud.com\/blog\/#\/schema\/person\/3b041b19cffc258705478ecfab895378\"},\"headline\":\"Understanding and utilizing CountDownLatch.\",\"datePublished\":\"2024-03-16T01:04:22+00:00\",\"dateModified\":\"2024-03-22T00:48:33+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\/\/www.silicloud.com\/blog\/understanding-and-utilizing-countdownlatch\/\"},\"wordCount\":248,\"commentCount\":0,\"publisher\":{\"@id\":\"https:\/\/www.silicloud.com\/blog\/#organization\"},\"inLanguage\":\"en-US\"},{\"@type\":\"WebPage\",\"@id\":\"https:\/\/www.silicloud.com\/blog\/understanding-and-utilizing-countdownlatch\/\",\"url\":\"https:\/\/www.silicloud.com\/blog\/understanding-and-utilizing-countdownlatch\/\",\"name\":\"Understanding and utilizing CountDownLatch. - Blog - Silicon Cloud\",\"isPartOf\":{\"@id\":\"https:\/\/www.silicloud.com\/blog\/#website\"},\"datePublished\":\"2024-03-16T01:04:22+00:00\",\"dateModified\":\"2024-03-22T00:48:33+00:00\",\"breadcrumb\":{\"@id\":\"https:\/\/www.silicloud.com\/blog\/understanding-and-utilizing-countdownlatch\/#breadcrumb\"},\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/www.silicloud.com\/blog\/understanding-and-utilizing-countdownlatch\/\"]}]},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/www.silicloud.com\/blog\/understanding-and-utilizing-countdownlatch\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\/\/www.silicloud.com\/blog\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Understanding and utilizing CountDownLatch.\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\/\/www.silicloud.com\/blog\/#website\",\"url\":\"https:\/\/www.silicloud.com\/blog\/\",\"name\":\"Silicon Cloud Blog\",\"description\":\"\",\"publisher\":{\"@id\":\"https:\/\/www.silicloud.com\/blog\/#organization\"},\"inLanguage\":\"en-US\"},{\"@type\":\"Organization\",\"@id\":\"https:\/\/www.silicloud.com\/blog\/#organization\",\"name\":\"Silicon Cloud Blog\",\"url\":\"https:\/\/www.silicloud.com\/blog\/\",\"logo\":{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\/\/www.silicloud.com\/blog\/#\/schema\/logo\/image\/\",\"url\":\"https:\/\/www.silicloud.com\/blog\/wp-content\/uploads\/2023\/11\/EN-SILICON-Full.png\",\"contentUrl\":\"https:\/\/www.silicloud.com\/blog\/wp-content\/uploads\/2023\/11\/EN-SILICON-Full.png\",\"width\":1024,\"height\":1024,\"caption\":\"Silicon Cloud Blog\"},\"image\":{\"@id\":\"https:\/\/www.silicloud.com\/blog\/#\/schema\/logo\/image\/\"},\"sameAs\":[\"https:\/\/www.facebook.com\/SiliCloudGlobal\/\",\"https:\/\/twitter.com\/SiliCloudGlobal\"]},{\"@type\":\"Person\",\"@id\":\"https:\/\/www.silicloud.com\/blog\/#\/schema\/person\/3b041b19cffc258705478ecfab895378\",\"name\":\"Emily Johnson\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\/\/www.silicloud.com\/blog\/#\/schema\/person\/image\/\",\"url\":\"https:\/\/secure.gravatar.com\/avatar\/a5cb4e73d02ab1d79f2dfe919389ff7c1de072baa97686392031c03d858cc358?s=96&d=mm&r=g\",\"contentUrl\":\"https:\/\/secure.gravatar.com\/avatar\/a5cb4e73d02ab1d79f2dfe919389ff7c1de072baa97686392031c03d858cc358?s=96&d=mm&r=g\",\"caption\":\"Emily Johnson\"},\"url\":\"https:\/\/www.silicloud.com\/blog\/author\/emilyjohnson\/\"}]}<\/script>\n<!-- \/ Yoast SEO Premium plugin. -->","yoast_head_json":{"title":"Understanding and utilizing CountDownLatch. - Blog - Silicon Cloud","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/www.silicloud.com\/blog\/understanding-and-utilizing-countdownlatch\/","og_locale":"en_US","og_type":"article","og_title":"Understanding and utilizing CountDownLatch.","og_description":"CountDownLatch is a concurrency utility class in Java that is used to implement the functionality of thread waiting. It allows one or more threads to wait for the completion of operations by other threads before continuing. CountDownLatch uses a counter to implement waiting. The initial value of the counter can be set to a positive [&hellip;]","og_url":"https:\/\/www.silicloud.com\/blog\/understanding-and-utilizing-countdownlatch\/","og_site_name":"Blog - Silicon Cloud","article_publisher":"https:\/\/www.facebook.com\/SiliCloudGlobal\/","article_published_time":"2024-03-16T01:04:22+00:00","article_modified_time":"2024-03-22T00:48:33+00:00","author":"Emily Johnson","twitter_card":"summary_large_image","twitter_creator":"@SiliCloudGlobal","twitter_site":"@SiliCloudGlobal","twitter_misc":{"Written by":"Emily Johnson","Est. reading time":"2 minutes"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/www.silicloud.com\/blog\/understanding-and-utilizing-countdownlatch\/#article","isPartOf":{"@id":"https:\/\/www.silicloud.com\/blog\/understanding-and-utilizing-countdownlatch\/"},"author":{"name":"Emily Johnson","@id":"https:\/\/www.silicloud.com\/blog\/#\/schema\/person\/3b041b19cffc258705478ecfab895378"},"headline":"Understanding and utilizing CountDownLatch.","datePublished":"2024-03-16T01:04:22+00:00","dateModified":"2024-03-22T00:48:33+00:00","mainEntityOfPage":{"@id":"https:\/\/www.silicloud.com\/blog\/understanding-and-utilizing-countdownlatch\/"},"wordCount":248,"commentCount":0,"publisher":{"@id":"https:\/\/www.silicloud.com\/blog\/#organization"},"inLanguage":"en-US"},{"@type":"WebPage","@id":"https:\/\/www.silicloud.com\/blog\/understanding-and-utilizing-countdownlatch\/","url":"https:\/\/www.silicloud.com\/blog\/understanding-and-utilizing-countdownlatch\/","name":"Understanding and utilizing CountDownLatch. - Blog - Silicon Cloud","isPartOf":{"@id":"https:\/\/www.silicloud.com\/blog\/#website"},"datePublished":"2024-03-16T01:04:22+00:00","dateModified":"2024-03-22T00:48:33+00:00","breadcrumb":{"@id":"https:\/\/www.silicloud.com\/blog\/understanding-and-utilizing-countdownlatch\/#breadcrumb"},"inLanguage":"en-US","potentialAction":[{"@type":"ReadAction","target":["https:\/\/www.silicloud.com\/blog\/understanding-and-utilizing-countdownlatch\/"]}]},{"@type":"BreadcrumbList","@id":"https:\/\/www.silicloud.com\/blog\/understanding-and-utilizing-countdownlatch\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/www.silicloud.com\/blog\/"},{"@type":"ListItem","position":2,"name":"Understanding and utilizing CountDownLatch."}]},{"@type":"WebSite","@id":"https:\/\/www.silicloud.com\/blog\/#website","url":"https:\/\/www.silicloud.com\/blog\/","name":"Silicon Cloud Blog","description":"","publisher":{"@id":"https:\/\/www.silicloud.com\/blog\/#organization"},"inLanguage":"en-US"},{"@type":"Organization","@id":"https:\/\/www.silicloud.com\/blog\/#organization","name":"Silicon Cloud Blog","url":"https:\/\/www.silicloud.com\/blog\/","logo":{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/www.silicloud.com\/blog\/#\/schema\/logo\/image\/","url":"https:\/\/www.silicloud.com\/blog\/wp-content\/uploads\/2023\/11\/EN-SILICON-Full.png","contentUrl":"https:\/\/www.silicloud.com\/blog\/wp-content\/uploads\/2023\/11\/EN-SILICON-Full.png","width":1024,"height":1024,"caption":"Silicon Cloud Blog"},"image":{"@id":"https:\/\/www.silicloud.com\/blog\/#\/schema\/logo\/image\/"},"sameAs":["https:\/\/www.facebook.com\/SiliCloudGlobal\/","https:\/\/twitter.com\/SiliCloudGlobal"]},{"@type":"Person","@id":"https:\/\/www.silicloud.com\/blog\/#\/schema\/person\/3b041b19cffc258705478ecfab895378","name":"Emily Johnson","image":{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/www.silicloud.com\/blog\/#\/schema\/person\/image\/","url":"https:\/\/secure.gravatar.com\/avatar\/a5cb4e73d02ab1d79f2dfe919389ff7c1de072baa97686392031c03d858cc358?s=96&d=mm&r=g","contentUrl":"https:\/\/secure.gravatar.com\/avatar\/a5cb4e73d02ab1d79f2dfe919389ff7c1de072baa97686392031c03d858cc358?s=96&d=mm&r=g","caption":"Emily Johnson"},"url":"https:\/\/www.silicloud.com\/blog\/author\/emilyjohnson\/"}]}},"_links":{"self":[{"href":"https:\/\/www.silicloud.com\/blog\/wp-json\/wp\/v2\/posts\/23246","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.silicloud.com\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.silicloud.com\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.silicloud.com\/blog\/wp-json\/wp\/v2\/users\/5"}],"replies":[{"embeddable":true,"href":"https:\/\/www.silicloud.com\/blog\/wp-json\/wp\/v2\/comments?post=23246"}],"version-history":[{"count":1,"href":"https:\/\/www.silicloud.com\/blog\/wp-json\/wp\/v2\/posts\/23246\/revisions"}],"predecessor-version":[{"id":57211,"href":"https:\/\/www.silicloud.com\/blog\/wp-json\/wp\/v2\/posts\/23246\/revisions\/57211"}],"wp:attachment":[{"href":"https:\/\/www.silicloud.com\/blog\/wp-json\/wp\/v2\/media?parent=23246"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.silicloud.com\/blog\/wp-json\/wp\/v2\/categories?post=23246"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.silicloud.com\/blog\/wp-json\/wp\/v2\/tags?post=23246"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}