java多线程 栅栏(CyclicBarrier) 和 多线程辅助类 CountDownLatch
2016-11-28 10:25
465 查看
5.JAVA 多线程: 要求所有线程执行完成后,等待未执行完的 线程执行完后,才会向下进行 用: countDownLatch countDownLatch = new CountDownLatch(int ThreadNumbers)
在线程执行完后 调用 countDownLatch 对象的 countDown() 方法,进行减一操作,做记数 。在线程池添加完所有任务后,调用latch.await() 方法让所有执行完成了的线程等待,当都执行完了的时候 才会向下执行。
CountDownLatch,一个同步辅助类,在完成一组正在其他线程中执行的操作之前,它允许一个或多个线程一直等待。
主要方法:
public CountDownLatch(int count); //构造方法参数指定了计数的次数
public void countDown(); //countDown方法,当前线程调用此方法,则计数减一
public void await() throws InterruptedException //awaint方法,调用此方法会一直阻塞当前线程,直到计时器的值为0 程序向下执行。
实例:
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("zhang san", 5000, latch);
Worker worker2=new Worker("li si", 8000, latch);
worker1.start();//
worker2.start();//
latch.await();//等待所有工人完成工作
System.out.println("all work done at "+sdf.format(new Date()));
}
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(){
System.out.println("Worker "+workerName+" do work begin at "+sdf.format(new Date()));
doWork();//工作了
System.out.println("Worker "+workerName+" do work complete at "+sdf.format(new Date()));
latch.countDown();//工人完成工作,计数器减一
}
private void doWork(){
try {
Thread.sleep(workTime);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
输出:
Worker zhang san do work begin at 2011-04-14 11:05:11
Worker li si do work begin at 2011-04-14 11:05:11
Worker zhang san do work complete at 2011-04-14 11:05:16
Worker li si do work complete at 2011-04-14 11:05:19
all work done at 2011-04-14 11:05:19
6.JAVA多线程 栅栏,CyclicBarrier,作用是要求所有线程都执行到 cyc.await() 设置的障碍 处,等待其他线程一起到达后,然后同时向下执行其他操作的处理。
实例:
public class ThreadTask implements Runnable {
private CyclicBarrier cyclicBarrier ;
private int rank;
public ThreadTask(){}
public ThreadTask(CyclicBarrier cyclicBarrier ,int rank){
this.cyclicBarrier = cyclicBarrier;
this.rank = rank;
}
@Override
public void run() {
for (int i = 0; i < 10; i++) {
System.out.println("任务:"+rank+"---执行中。。。");
}
try {
cyclicBarrier.await();
System.out.println("任务:"+rank+"****************已到达指定地点,处于等待状态。");
} catch (InterruptedException e) {
e.printStackTrace();
} catch (BrokenBarrierException e) {
e.printStackTrace();
}
System.out.println("调用一个公共的业务逻辑方法。。。。");
}
}
测试主类:
public class TestCyclicBarrierDemo {
public static void main(String[] args) {
ExecutorService pool = Executors.newFixedThreadPool(8);
CyclicBarrier cyclicBarrier = new CyclicBarrier(8);
for (int i = 0; i < 8; i++) {
pool.submit((new ThreadTask(cyclicBarrier,i)));
}
pool.shutdown();
}
}
在线程执行完后 调用 countDownLatch 对象的 countDown() 方法,进行减一操作,做记数 。在线程池添加完所有任务后,调用latch.await() 方法让所有执行完成了的线程等待,当都执行完了的时候 才会向下执行。
CountDownLatch,一个同步辅助类,在完成一组正在其他线程中执行的操作之前,它允许一个或多个线程一直等待。
主要方法:
public CountDownLatch(int count); //构造方法参数指定了计数的次数
public void countDown(); //countDown方法,当前线程调用此方法,则计数减一
public void await() throws InterruptedException //awaint方法,调用此方法会一直阻塞当前线程,直到计时器的值为0 程序向下执行。
实例:
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("zhang san", 5000, latch);
Worker worker2=new Worker("li si", 8000, latch);
worker1.start();//
worker2.start();//
latch.await();//等待所有工人完成工作
System.out.println("all work done at "+sdf.format(new Date()));
}
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(){
System.out.println("Worker "+workerName+" do work begin at "+sdf.format(new Date()));
doWork();//工作了
System.out.println("Worker "+workerName+" do work complete at "+sdf.format(new Date()));
latch.countDown();//工人完成工作,计数器减一
}
private void doWork(){
try {
Thread.sleep(workTime);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
输出:
Worker zhang san do work begin at 2011-04-14 11:05:11
Worker li si do work begin at 2011-04-14 11:05:11
Worker zhang san do work complete at 2011-04-14 11:05:16
Worker li si do work complete at 2011-04-14 11:05:19
all work done at 2011-04-14 11:05:19
6.JAVA多线程 栅栏,CyclicBarrier,作用是要求所有线程都执行到 cyc.await() 设置的障碍 处,等待其他线程一起到达后,然后同时向下执行其他操作的处理。
实例:
public class ThreadTask implements Runnable {
private CyclicBarrier cyclicBarrier ;
private int rank;
public ThreadTask(){}
public ThreadTask(CyclicBarrier cyclicBarrier ,int rank){
this.cyclicBarrier = cyclicBarrier;
this.rank = rank;
}
@Override
public void run() {
for (int i = 0; i < 10; i++) {
System.out.println("任务:"+rank+"---执行中。。。");
}
try {
cyclicBarrier.await();
System.out.println("任务:"+rank+"****************已到达指定地点,处于等待状态。");
} catch (InterruptedException e) {
e.printStackTrace();
} catch (BrokenBarrierException e) {
e.printStackTrace();
}
System.out.println("调用一个公共的业务逻辑方法。。。。");
}
}
测试主类:
public class TestCyclicBarrierDemo {
public static void main(String[] args) {
ExecutorService pool = Executors.newFixedThreadPool(8);
CyclicBarrier cyclicBarrier = new CyclicBarrier(8);
for (int i = 0; i < 8; i++) {
pool.submit((new ThreadTask(cyclicBarrier,i)));
}
pool.shutdown();
}
}
相关文章推荐
- java多线程并发(一)Semaphore,volatile,synchronized ,Lock, CyclicBarrier和CountDownLatch
- 两个重要的多线程辅助类之CyclicBarrier和CountDownLatch的用法
- 【Java多线程】同步辅助类CyclicBarrier
- Java多线程——其他工具类CyclicBarrier、CountDownLatch和Exchange
- 【java】多线程控制(一)---Semaphore、Exchanger、CyclicBarrier、CountDownLatch
- java多线程-concurrent-CountDownLatch和CyclicBarrier
- java多线程开发之CyclicBarrier,CountDownLatch
- Java5 多线程(五)--CyclicBarrier同步的工具类
- Java多线程与并发库高级应用之公共屏障点CyclicBarrier
- java多线程编程——同步器CyclicBarrier(二)
- Java:多线程等待所有线程结束(CountDownLatch/CyclicBarrier) .
- java 中间件学习4-CountDownLatch、CyclicBarrier、Future和FutureTask
- Java多线程之CyclicBarrier
- Java多线程(八)之Semaphore、CountDownLatch、CyclicBarrier、Exchanger
- JAVA多线程之CyclicBarrier
- java之JUC系列-外部Tools-Executors|Semaphor|Exchanger|CyclicBarrier|CountDownLatch
- java多线程之CyclicBarrier简单用法
- Java多线程 - 浅析CyclicBarrier的用法
- Java多线程之CyclicBarrier
- 多线程CyclicBarrier与CountDownLatch使用示例