What is CountDownLatch in Java
2016-04-13 11:30
495 查看
转自:http://javarevisited.blogspot.hk/2012/07/countdownlatch-example-in-java.html
What is CountDownLatch in Java
CountDownLatch in Java is a kind of synchronizer which allows one Thread to wait for one or more Threads before starts processing. This is very crucial requirement and often needed in server side core Java application and having this functionality built-in
as CountDownLatch greatly simplifies the development. CountDownLatch in Java is introduced on Java 5 along with other concurrent utilities like
CyclicBarrier,
Semaphore,
ConcurrentHashMap and
BlockingQueue in java.util.concurrent package. In this Java concurrency tutorial we will what is CountDownLatch in Java, How CountDownLatch works in Java, an example of
CountDownLatch in Java and finally some worth noting points about this concurrent utility. You can also implement same functionality using wait
and notify mechanism in Java but it requires lot of code and getting it write in first attempt is tricky, With CountDownLatch it can be done in just few lines. CountDownLatch also allows flexibility on number of thread for which
main thread should wait, It can wait for one thread or n number of thread, there is not much change on code. Key point is that you need to figure out where to use CountDownLatch in Java application which is not difficult if you understand
What is CountDownLatch in Java, What does CountDownLatch do and How CountDownLatch works in Java.
How CountDownLatch works in Java
Now
we know What is CountDownLatch in Java, its time to find out How CountDownLatch works in Java. CountDownLatch works in latch principle, main thread will wait until Gate is open. One
thread waits for n number of threads specified while creating CountDownLatch in Java. Any thread, usually main thread of application, which calls CountDownLatch.await() will wait until count reaches zero or its interrupted by another Thread. All other
thread are required to do count down by calling CountDownLatch.countDown() once they are completed or ready to the job. as soon as count reaches zero,
Thread awaiting starts running. One of the disadvantage of CountDownLatch is that
its not reusable once count reaches to zero you can not use CountDownLatch any more, but don't worry Java concurrency API has another concurrent utility called
CyclicBarrier for such requirements.
CountDownLatch in Java. In following CountDownLatch example, Java program requires 3 services namely CacheService, AlertService and ValidationService to be started and ready before application can handle any
request and this is achieved by using CountDownLatch in Java.
import
java.util.Date;
import
java.util.concurrent.CountDownLatch;
import
java.util.logging.Level;
import
java.util.logging.Logger;
/**
* Java program to demonstrate How to use CountDownLatch in Java. CountDownLatch is
* useful if you want to start main processing thread once its dependency is completed
* as illustrated in this CountDownLatch Example
*
* @author Javin Paul
*/
public class CountDownLatchDemo
{
public static
void main(String args[])
{
final CountDownLatch latch =
new CountDownLatch(3);
Thread cacheService = new Thread(new Service("CacheService",
1000, latch));
Thread alertService = new Thread(new Service("AlertService",
1000, latch));
Thread validationService = new Thread(new Service("ValidationService",
1000, latch));
cacheService.start(); //separate thread will initialize CacheService
alertService.start(); //another thread for AlertService initialization
validationService.start();
// application should not start processing any thread until all service is up
// and ready to do there job.
// Countdown latch is idle choice here, main thread will start with count 3
// and wait until count reaches zero. each thread once up and read will do
// a count down. this will ensure that main thread is not started processing
// until all services is up.
//count is 3 since we have 3 Threads (Services)
try{
latch.await(); //main thread is waiting on CountDownLatch to finish
System.out.println("All services are up, Application is starting now");
}catch(InterruptedException ie){
ie.printStackTrace();
}
}
}
/**
* Service class which will be executed by Thread using CountDownLatch synchronizer.
*/
class Service implements Runnable{
private final String name;
private final
int timeToStart;
private final CountDownLatch latch;
public Service(String name,
int timeToStart, CountDownLatch latch){
this.name = name;
this.timeToStart = timeToStart;
this.latch = latch;
}
@Override
public void run()
{
try
{
Thread.sleep(timeToStart);
} catch
(InterruptedException ex)
{
Logger.getLogger(Service.class.getName()).log(Level.SEVERE,
null, ex);
}
System.out.println( name +
" is Up");
latch.countDown(); //reduce count of CountDownLatch by 1
}
}
Output:
ValidationService is Up
AlertService is Up
CacheService is Up
All services are up, Application is starting now
By looking at output of this CountDownLatch example in Java, you can see that Application is not started until all services started by individual Threads are completed.
main thread, require to wait for one or more thread to complete, before its start doing processing. Classical example of using CountDownLatch in Java is any server side core Java application which uses services architecture, where multiple services is
provided by multiple threads and application can not start processing until all services have started successfully as shown in our CountDownLatch example.
CountDownLatch in Java – Things to remember
Few points about Java CountDownLatch which is worth remembering:
1) You can not reuse CountDownLatch once count is reaches to zero, this is the main
difference between CountDownLatch and CyclicBarrier, which is frequently asked in
core Java interviews and
multi-threading interviews.
2) Main Thread wait on Latch by calling CountDownLatch.await() method while other thread calls CountDownLatch.countDown() to inform that they have completed.
That’s all on What is CountDownLatch in Java, What does CountDownLatch do in Java, How CountDownLatch works in Java along with a real life CountDownLatch example in Java. This is a very useful concurrency utility and if you master
when to use CountDownLatch and how to use CountDownLatch you will be able to reduce good amount of complex concurrency control code written using wait and notify in Java.
Other Java concurrency examples from Javarevisited.
When to use ThreadLocal variable in Java
Difference between Runnable and Thread in Java
How to stop Thread in Java
How to fix deadlock in Java
How to find race conditions in Java
How to write Thread-safe code in Java
Read more: http://javarevisited.blogspot.com/2012/07/countdownlatch-example-in-java.html#ixzz45fpoCHz6
What is CountDownLatch in Java
CountDownLatch in Java is a kind of synchronizer which allows one Thread to wait for one or more Threads before starts processing. This is very crucial requirement and often needed in server side core Java application and having this functionality built-in
as CountDownLatch greatly simplifies the development. CountDownLatch in Java is introduced on Java 5 along with other concurrent utilities like
CyclicBarrier,
Semaphore,
ConcurrentHashMap and
BlockingQueue in java.util.concurrent package. In this Java concurrency tutorial we will what is CountDownLatch in Java, How CountDownLatch works in Java, an example of
CountDownLatch in Java and finally some worth noting points about this concurrent utility. You can also implement same functionality using wait
and notify mechanism in Java but it requires lot of code and getting it write in first attempt is tricky, With CountDownLatch it can be done in just few lines. CountDownLatch also allows flexibility on number of thread for which
main thread should wait, It can wait for one thread or n number of thread, there is not much change on code. Key point is that you need to figure out where to use CountDownLatch in Java application which is not difficult if you understand
What is CountDownLatch in Java, What does CountDownLatch do and How CountDownLatch works in Java.
How CountDownLatch works in Java
Now
we know What is CountDownLatch in Java, its time to find out How CountDownLatch works in Java. CountDownLatch works in latch principle, main thread will wait until Gate is open. One
thread waits for n number of threads specified while creating CountDownLatch in Java. Any thread, usually main thread of application, which calls CountDownLatch.await() will wait until count reaches zero or its interrupted by another Thread. All other
thread are required to do count down by calling CountDownLatch.countDown() once they are completed or ready to the job. as soon as count reaches zero,
Thread awaiting starts running. One of the disadvantage of CountDownLatch is that
its not reusable once count reaches to zero you can not use CountDownLatch any more, but don't worry Java concurrency API has another concurrent utility called
CyclicBarrier for such requirements.
CountDownLatch Exmaple in Java
In this section we will see a full featured real world example of usingCountDownLatch in Java. In following CountDownLatch example, Java program requires 3 services namely CacheService, AlertService and ValidationService to be started and ready before application can handle any
request and this is achieved by using CountDownLatch in Java.
import
java.util.Date;
import
java.util.concurrent.CountDownLatch;
import
java.util.logging.Level;
import
java.util.logging.Logger;
/**
* Java program to demonstrate How to use CountDownLatch in Java. CountDownLatch is
* useful if you want to start main processing thread once its dependency is completed
* as illustrated in this CountDownLatch Example
*
* @author Javin Paul
*/
public class CountDownLatchDemo
{
public static
void main(String args[])
{
final CountDownLatch latch =
new CountDownLatch(3);
Thread cacheService = new Thread(new Service("CacheService",
1000, latch));
Thread alertService = new Thread(new Service("AlertService",
1000, latch));
Thread validationService = new Thread(new Service("ValidationService",
1000, latch));
cacheService.start(); //separate thread will initialize CacheService
alertService.start(); //another thread for AlertService initialization
validationService.start();
// application should not start processing any thread until all service is up
// and ready to do there job.
// Countdown latch is idle choice here, main thread will start with count 3
// and wait until count reaches zero. each thread once up and read will do
// a count down. this will ensure that main thread is not started processing
// until all services is up.
//count is 3 since we have 3 Threads (Services)
try{
latch.await(); //main thread is waiting on CountDownLatch to finish
System.out.println("All services are up, Application is starting now");
}catch(InterruptedException ie){
ie.printStackTrace();
}
}
}
/**
* Service class which will be executed by Thread using CountDownLatch synchronizer.
*/
class Service implements Runnable{
private final String name;
private final
int timeToStart;
private final CountDownLatch latch;
public Service(String name,
int timeToStart, CountDownLatch latch){
this.name = name;
this.timeToStart = timeToStart;
this.latch = latch;
}
@Override
public void run()
{
try
{
Thread.sleep(timeToStart);
} catch
(InterruptedException ex)
{
Logger.getLogger(Service.class.getName()).log(Level.SEVERE,
null, ex);
}
System.out.println( name +
" is Up");
latch.countDown(); //reduce count of CountDownLatch by 1
}
}
Output:
ValidationService is Up
AlertService is Up
CacheService is Up
All services are up, Application is starting now
By looking at output of this CountDownLatch example in Java, you can see that Application is not started until all services started by individual Threads are completed.
When should we use CountDownLatch in Java :
Use CountDownLatch when one of Thread likemain thread, require to wait for one or more thread to complete, before its start doing processing. Classical example of using CountDownLatch in Java is any server side core Java application which uses services architecture, where multiple services is
provided by multiple threads and application can not start processing until all services have started successfully as shown in our CountDownLatch example.
CountDownLatch in Java – Things to remember
Few points about Java CountDownLatch which is worth remembering:
1) You can not reuse CountDownLatch once count is reaches to zero, this is the main
difference between CountDownLatch and CyclicBarrier, which is frequently asked in
core Java interviews and
multi-threading interviews.
2) Main Thread wait on Latch by calling CountDownLatch.await() method while other thread calls CountDownLatch.countDown() to inform that they have completed.
That’s all on What is CountDownLatch in Java, What does CountDownLatch do in Java, How CountDownLatch works in Java along with a real life CountDownLatch example in Java. This is a very useful concurrency utility and if you master
when to use CountDownLatch and how to use CountDownLatch you will be able to reduce good amount of complex concurrency control code written using wait and notify in Java.
Other Java concurrency examples from Javarevisited.
When to use ThreadLocal variable in Java
Difference between Runnable and Thread in Java
How to stop Thread in Java
How to fix deadlock in Java
How to find race conditions in Java
How to write Thread-safe code in Java
Read more: http://javarevisited.blogspot.com/2012/07/countdownlatch-example-in-java.html#ixzz45fpoCHz6
相关文章推荐
- Spring框架下的单元测试方法
- Spring+Struts+Hibernate框架详解
- Java ClassLoader基础及加载不同依赖 Jar 中的公共类
- Java文件操作
- [Java] 匿名内部类
- LeetCode Power of Three JAVA
- [Java] 内部类的用法
- Java 并发专题 :FutureTask 实现预加载数据 在线看电子书、浏览器浏览网页等
- Java中,当表单含有文件上传时,提交数据的如何读取(感谢作者分享)
- java notify() 线程协作
- 用java写简单的web服务器,在宿舍提供视频播放
- org.springframework.orm.hibernate3.LocalDataSourceConnectionProvider
- 深入研究java.lang.Runtime类
- Java学习·eclipse换主题颜色
- Spring4.1 cache 应用
- Spring4搭建+REST在Spring上搭建
- eclipse安装svn插件集合(第四种亲测)
- java序列化和反序列化
- 推荐eclipse插件Properties Editor
- 【java项目实战】Servlet详解以及Servlet编写登陆页面(二)