volatile关键字解析:
http://mp.weixin.qq.com/s?src=3×tamp=1474600039&ver=1&signature=fA4OwtcYwsEBwff*JKCl2mg-fR9TBZAoKJwxenYeMQ1ltg03UfyoEHJbhNg6pJANiba4TJn8M5knDiJL5m8IhhvE0eZkBtft7f0Y57719vpwqrZQ27FH3STrgvN5ZLzYjZ3pA4gYF*N*jQ5oGuo5wA==
同步辅助类,让N个线程互相等待,子线程结束后,可以启动另一个线程进行汇总
* 场景设想:
* 有一个公司要对3个部门,分别进行工资统计,然后进行对比 ,和汇总
* 但每个部门的数据还是比较大的, 这时候启动3个线程
* 当3个线程全部执行结束了,在进行汇总计算总工资数目
public class CyclicBarrierLatchTest2 {
public static Integer num1;
public static Integer num2;
public static Integer num3;
public static Integer total ;
public static void main(String[] args) {
//所有线程执行完毕标识
final ExecutorService executor = Executors.newFixedThreadPool(3) ;
CyclicBarrier bar = new CyclicBarrier(4 , new Runnable() {
@Override
public void run() {
CyclicBarrierLatchTest2.total = CyclicBarrierLatchTest2.num1+
CyclicBarrierLatchTest2.num2+CyclicBarrierLatchTest2.num3 ;
System.out.println( "最后计算结果:"+CyclicBarrierLatchTest2.total);
executor.shutdown();
}
});
try {
for(int i=1;i<4;i++){
Thread.sleep(500);//利用sleep,说明工人开始时间不同
executor.execute( new SlaveThread3(bar,i));
//new Thread(new SlaveThread3(bar,i)).start();
}
bar.await();
} catch (InterruptedException e1) {
e1.printStackTrace();
}catch ( Exception e) {
e.printStackTrace();
}
System.out.println("主任务完成。。");
}
}
//工人类
class SlaveThread3 extends Thread{
private CyclicBarrier bar ;
private int flag ;
public SlaveThread3( CyclicBarrier bar ,Integer flag ){
this.bar = bar ;
this.flag= flag ;
}
@Override
public void run() {
long start = System.currentTimeMillis() ;
System.out.println( "线程"+flag+"起止时间"+start);
try {
takeUp() ;
//当前工人用力完毕,结束
bar.await();
} catch ( Exception e) {
e.printStackTrace();
}
System.out.println( "线程"+flag+"结束时间"+start);
}
//抬起
public void takeUp(){
if(flag==1){ //线程1数据统计
CyclicBarrierLatchTest2.num1 = 1 ;
}else if(flag==2){//线程2数据统计
CyclicBarrierLatchTest2.num2 = 1 ;
}else if(flag==3){//线程3数据统计
CyclicBarrierLatchTest2.num3 = 1 ;
}
}
}