并发编程-concurrent.util工具类中的使用

来源:互联网 发布:java培训ujiuye 编辑:程序博客网 时间:2024/06/05 17:50

概念:

    该工具包下的类是用于在多任务下并发工具类。

    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();




}





}


0 0
原创粉丝点击