java 并发工具类-CountDownLatch
2017-03-06 11:45
417 查看
1.线程同步工具之CountDownLatch
CountDownLatch工作原理相对简单,可以简单看成一个倒计数器,在构造方法中指定初始值,每次调用countDown()方法时将计数器减1,而await()会等待计数器变为0。CountDownLatch关键接口如下
countDown() 如果当前计数器的值大于1,则将其减1;若当前值为1,则将其置为0并唤醒所有通过await等待的线程;若当前值为0,则什么也不做直接返回。
await() 等待计数器的值为0,若计数器的值为0则该方法返回;若等待期间该线程被中断,则抛出InterruptedException并清除该线程的中断状态。
await(long timeout, TimeUnit unit) 在指定的时间内等待计数器的值为0,若在指定时间内计数器的值变为0,则该方法返回true;若指定时间内计数器的值仍未变为0,则返回false;若指定时间内计数器的值变为0之前当前线程被中断,则抛出InterruptedException并清除该线程的中断状态。
getCount() 读取当前计数器的值,一般用于调试或者测试。
构造方法参数指定了计数的次数
countDown方法,当前线程调用此方法,则计数减一
awaint方法,调用此方法会一直阻塞当前线程,直到计时器的值为0
-------------------------code----------------------------------------
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.concurrent.CountDownLatch;
public class CountDownLatchDemo {
final static SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
public static void main(String[] args) throws InterruptedException {
CountDownLatch latch = new CountDownLatch(2);// 两个工人的协作
Worker worker1 = new Worker("张三", 1000, latch);
Worker worker2 = new Worker("李四", 8000, latch);
worker1.start();//
worker2.start();//
latch.await();// 等待所有工人完成工作
System.out.println("全部工作完成--> " + sdf.format(new Date()));
System.out.println("计数器:"+latch.getCount());
}
static class Worker extends Thread {
String workerName;
int workTime;
CountDownLatch latch;
public Worker(String workerName, int workTime, CountDownLatch latch) {
this.workerName = workerName;
this.workTime = workTime;
this.latch = latch;
}
public void run() {
doWork();// 工作时间
System.out.println(workerName + "--> 工作时间:" + sdf.format(new Date()));
System.out.println("计数器:"+latch.getCount());
latch.countDown();// 工人完成工作,计数器减一
}
private void doWork() {
try {
Thread.sleep(workTime);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
CountDownLatch主要接口分析
CountDownLatch工作原理相对简单,可以简单看成一个倒计数器,在构造方法中指定初始值,每次调用countDown()方法时将计数器减1,而await()会等待计数器变为0。CountDownLatch关键接口如下countDown() 如果当前计数器的值大于1,则将其减1;若当前值为1,则将其置为0并唤醒所有通过await等待的线程;若当前值为0,则什么也不做直接返回。
await() 等待计数器的值为0,若计数器的值为0则该方法返回;若等待期间该线程被中断,则抛出InterruptedException并清除该线程的中断状态。
await(long timeout, TimeUnit unit) 在指定的时间内等待计数器的值为0,若在指定时间内计数器的值变为0,则该方法返回true;若指定时间内计数器的值仍未变为0,则返回false;若指定时间内计数器的值变为0之前当前线程被中断,则抛出InterruptedException并清除该线程的中断状态。
getCount() 读取当前计数器的值,一般用于调试或者测试。
构造方法参数指定了计数的次数
countDown方法,当前线程调用此方法,则计数减一
awaint方法,调用此方法会一直阻塞当前线程,直到计时器的值为0
-------------------------code----------------------------------------
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.concurrent.CountDownLatch;
public class CountDownLatchDemo {
final static SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
public static void main(String[] args) throws InterruptedException {
CountDownLatch latch = new CountDownLatch(2);// 两个工人的协作
Worker worker1 = new Worker("张三", 1000, latch);
Worker worker2 = new Worker("李四", 8000, latch);
worker1.start();//
worker2.start();//
latch.await();// 等待所有工人完成工作
System.out.println("全部工作完成--> " + sdf.format(new Date()));
System.out.println("计数器:"+latch.getCount());
}
static class Worker extends Thread {
String workerName;
int workTime;
CountDownLatch latch;
public Worker(String workerName, int workTime, CountDownLatch latch) {
this.workerName = workerName;
this.workTime = workTime;
this.latch = latch;
}
public void run() {
doWork();// 工作时间
System.out.println(workerName + "--> 工作时间:" + sdf.format(new Date()));
System.out.println("计数器:"+latch.getCount());
latch.countDown();// 工人完成工作,计数器减一
}
private void doWork() {
try {
Thread.sleep(workTime);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
相关文章推荐
- Java并发工具类(一):等待多线程完成的CountDownLatch
- Java并发工具类CountDownLatch
- 【死磕Java并发】-----J.U.C之并发工具类:CountDownLatch
- 【死磕Java并发】-----J.U.C之并发工具类:CountDownLatch
- 【死磕Java并发】-----J.U.C之并发工具类:CountDownLatch
- Java并发工具类 - CountDownLatch
- 【死磕Java并发】-----J.U.C之并发工具类:CountDownLatch
- 【死磕Java并发】-----J.U.C之并发工具类:CountDownLatch
- java并发中的协同工具类介绍-CountDownLatch-CyclicBarrier-Semphone-Exchanger
- Java并发工具类之CountDownLatch
- 【死磕Java并发】-----J.U.C之并发工具类:CountDownLatch
- 【死磕Java并发】-----J.U.C之并发工具类:CountDownLatch
- 【死磕Java并发】-----J.U.C之并发工具类:CountDownLatch
- 【死磕Java并发】-----J.U.C之并发工具类:CountDownLatch
- java多线程解说【拾伍】_并发工具类:CountDownLatch
- Java并发工具类CountDownLatch和CyclicBarrier
- Java并发工具类CountDownLatch和CyclicBarrier
- 【死磕Java并发】-----J.U.C之并发工具类:CountDownLatch
- Java并发同步工具类之CountDownLatch
- 【死磕Java并发】-----J.U.C之并发工具类:CountDownLatch