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 程序向下执行。
实例:
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("调用一个公共的业务逻辑方法。。。。");
}
在线程执行完后 调用 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();
}
}