CyclicBarrier
屏障:
一个简单的功能:
package com.roocon.thread.tb5;
import java.util.Random;
import java.util.concurrent.CyclicBarrier;
public class DemoMy {
Random random = new Random();
public void meeting(CyclicBarrier barrier) {
try {
Thread.sleep(random.nextInt(4000));
} catch (InterruptedException e1) {
e1.printStackTrace();
}
System.out.println(Thread.currentThread().getName() + " arrive meetroom wait..");
try {
barrier.await();//2.在这里await
} catch (Exception e) {
e.printStackTrace();
}
}
public static void main(String[] args) {
DemoMy demo = new DemoMy();
CyclicBarrier barrier = new CyclicBarrier(10, new Runnable() {//0.new一个barrier
@Override
public void run() {
System.out.println("ok! begin meeting...");
}
});
for (int i = 0; i < 10; i++) {
new Thread(new Runnable() {
@Override
public void run() {
demo.meeting(barrier);//1.在run方法传入实例
}
}).start();
}
}
}
假设某个线程出现了异常则会一直等待的。
package com.roocon.thread.tb5;
import java.util.Random;
import java.util.concurrent.CyclicBarrier;
public class DemoMy {
Random random = new Random();
public void meeting(CyclicBarrier barrier) {
try {
Thread.sleep(random.nextInt(4000));
} catch (InterruptedException e1) {
e1.printStackTrace();
}
System.out.println(Thread.currentThread().getName() + " arrive meetroom wait..");
if(Thread.currentThread().getName().equals("Thread-7")) {
// Thread.currentThread().interrupt();
/*try {
Thread.sleep(10000);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}*/
throw new RuntimeException();
}
try {
barrier.await();//2.在这里await
} catch (Exception e) {
e.printStackTrace();
}
}
public static void main(String[] args) {
DemoMy demo = new DemoMy();
CyclicBarrier barrier = new CyclicBarrier(10, new Runnable() {//0.new一个barrier
@Override
public void run() {
System.out.println("ok! begin meeting...");
}
});
for (int i = 0; i < 10; i++) {
new Thread(new Runnable() {
@Override
public void run() {
demo.meeting(barrier);//1.在run方法传入实例
}
}).start();
}
}
}
----------------------------------------------------------tb5--------------------------------------------------------------
CyclicBarrier小结:
1.主线程new CyclicBarrier barrier
2.线程的run方法的方法体,传入barrier到目标方法
3.在目标方法里面wait
4.到齐了就执行
CyclicBarrier barrier = new CyclicBarrier(10, new Runnable() {//0.new一个barrier
@Override
public void run() {
System.out.println("ok! begin meeting...");
}
});