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();
}
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 ();
} 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. join ();
t3. start();
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