概念:
该工具包下的类是用于在多任务下并发工具类。
1、CountDownLatch
该类类似于wait,notify的作用。
应用场景:在多线程并发中,一个线程执行前提是需要另一个线程执行之后才能执行。
其中final CountDownLatch countDown=new CountDownLatch(2);构造函数中的参数表示其它线程调用countDown.countDown()的次数。也就是说如果是2,那么在其它线程中调用两次countDown()方法,才会唤醒等待线程的执行。
import java.util.concurrent.CountDownLatch;
public class CountDownLatchs {
public static void main(String[] args) {
final CountDownLatch countDown=new CountDownLatch(2);
Thread thread1=new Thread(new Runnable() {
@Override
public void run() {
// TODO Auto-generated method stub
System.out.println("任务一开始执行");
try {
countDown.await();
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
};
System.out.println("任务一执行完成");
}
});
Thread thread2=new Thread(new Runnable() {
@Override
public void run() {
// TODO Auto-generated method stub
System.out.println("任务二开始执行");
countDown.countDown();;
System.out.println("唤醒任务一执行");
}
});
Thread thread3=new Thread(new Runnable() {
@Override
public void run() {
// TODO Auto-generated method stub
System.out.println("任务三开始执行");
countDown.countDown();;
System.out.println("唤醒任务一执行");
}
});
thread1.start();
thread2.start();
thread3.start();
}
}
2、CyclicBarrier
几运动员在比赛时,如果有一个运动员没有准备好,那么比赛就不 能开始,只有所有运动员都准备好后,比赛才开始。
import java.lang.reflect.Executable;
import java.util.concurrent.BrokenBarrierException;
import java.util.concurrent.CyclicBarrier;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
public class CylicBarriers implements Runnable {
private CyclicBarrier barrier;
private String name ;
public CylicBarriers(CyclicBarrier barrier,String name) {
// TODO Auto-generated constructor stub
this.barrier=barrier;
this.name=name;
}
@Override
public void run() {
// TODO Auto-generated method stub
System.out.println("运动员---"+this.name+"--准备ok");
try {
this.barrier.await();
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (BrokenBarrierException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
System.out.println("运动员-----"+this.name+"---go");
}
public static void main(String[] args) {
CyclicBarrier barrier=new CyclicBarrier(2);
ExecutorService executor= Executors.newFixedThreadPool(2);
executor.execute(new CylicBarriers(barrier,"张三"));
executor.execute(new CylicBarriers(barrier,"李四"));
executor.shutdown();
}
}