并发、线程简单理解:
一、同步计数器:
1、CountDownLatch同步计数器:
- 倒计数门闩,在完成一组正在其他线程中执行得操作之前,它允许一个或多个线程一直等待,在计数器到达0之前,
await
方法会一直阻塞;之后会释放所有等待线程,await
的所有后续调用都将返回;
- 方法:
CountDownLatch(int count);
void await();
boolean await(long timeout,TimeUnit unit);
void countDown();
long getCount();
- 使用场景:
- 开5个线程去下载,当5个线程都执行完才算下载成功;
- 多个线程上传文件,只有当每个文件都上传成功才算成功;
- 示例:
public class CountDownLatchDemo {
static class Worker extends Thread{
private String workerName;
private CountDownLatch latch;
public Worker(String workerName,CountDownLatch latch){
this.workerName = workerName;
this.latch = latch;
}
@Override
public void run() {
try {
System.out.println("Thread "+ this.workerName+" is begin!");
Thread.sleep(2000l);
System.out.println("Thread "+ this.workerName+" is end!");
} catch (InterruptedException e) {
throw new RuntimeException(e);
} finally {
latch.countDown();
}
}
}
public static void main(String[] args) throws InterruptedException {
CountDownLatch latch = new CountDownLatch(3);
Worker worker1 = new Worker("11111",latch);
Worker worker2 = new Worker("22222",latch);
Worker worker3 = new Worker("33333",latch);
worker1.start();
worker2.start();
worker3.start();
latch.