java中控制线程间执行顺序的方法

CyclicBarrier 类

  • #### 意义:让一组线程等待至某种状态后全部执行。
  • #### 内置方法:
1. 两组构造函数
public CyclicBarrier(int parties,Runnable action)
 参数为一组线程的个数,action为达到某种状态后执行的动作
public CyclicBarrier(int parties)
 参数为一组线程的个数
2. 两组等待方法:
public int await() throws InterruptedException, BrokenBarrierException { };
 等待至线程执行完后执行后续动作
public int await(long timeout, TimeUnit unit)throws InterruptedException,BrokenBarrierException,TimeoutException { };
 等待一定的时间后执行后续动作,不管同一组线程是否执行完成。
  • 用法:
1.声明一个CyclicBarrier对象,控制N个线程为一组进行状态控制,将其传入为一组线程中,再线程中执行任务完成的地方写上await函数进行等待。
public class Test {
    public static void main(String[] args) {
        int N = 4;
        CyclicBarrier barrier  = new CyclicBarrier(N,new Runnable() {
            @Override
            public void run() {
                System.out.println("当前线程"+Thread.currentThread().getName());   
            }
        });

        for(int i=0;i<N;i++)
            new Writer(barrier).start();//将barrier传入线程并启动线程
    }
    static class Writer extends Thread{
        private CyclicBarrier cyclicBarrier;
        public Writer(CyclicBarrier cyclicBarrier) {
            this.cyclicBarrier = cyclicBarrier;
        }

        @Override
        public void run() {
            System.out.println("线程"+Thread.currentThread().getName()+"正在写入数据...");
            try {
                Thread.sleep(5000);      //以睡眠来模拟写入数据操作
                System.out.println("线程"+Thread.currentThread().getName()+"写入数据完毕,等待其他线程写入完毕");
                cyclicBarrier.await();
                //cyclicBarrier.await(10000,TimeUnit.MILLISECONDS);等待定时间长后执行
            } catch (InterruptedException e) {
                e.printStackTrace();
            }catch(BrokenBarrierException e){
                e.printStackTrace();
            }
            System.out.println("所有线程写入完毕,继续处理其他任务...");
        }
    }
}

Thread.join() 方法

  • #### 意义:控制线程间的同步执行。将交替执行的线程变为顺序执行的,再B线程前调用A线程的join函数,意为再A执行完成后执行B线程。
  • #### 方法
    ##### 1. t.join()//调用线程t在此之前执行完成
    ##### 2. t.join(millseconds)//等待t线程执行,等待时间为**毫秒
  • #### 用法
Thread t1 = new OneThread("X", queue);
Thread t2 = new OneThread("Y", queue);
Thread t3 = new OneThread("Z",queue);

t1.start();
t1.join();
t2.start();//t2执行前t1会执行完成
t2.join();
t3.start();//t3执行前t2会执行完成
t3.join();

 CountDownLatch类

  • #### 意义:计数器的功能,例如再A线程执行前需要执行4个线程,可利用此计数器在4个线程执行完成后再执行

内置方法:

1.构造函数
public CountDownLatch(int count) {  };
 //count为前面所需执行线程数
2.阻塞函数:
public void await() throw InterruptedException{};
//等待至count为0开始执行
public boolean await(long timeout, TimeUnit unit) throws InterruptedException{}
//和await()类似,只不过等待一定的时间后count值还没变为0的话就会继续执行
public void countDown() { };  
//将count值减1