bsp; try {
// 等待所有士兵到期
cyclic.await();
doWork();
// 等待所有士兵完成工作
cyclic.await();
} catch (InterruptedException e) {
e.printStackTrace();
} catch (BrokenBarrierException e) {
e.printStackTrace();
}
}
void doWork() {
try {
Thread.sleep(Math.abs(new Random().nextInt() % 10000));
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println(soldier + " 任务完成!");
}
}
public static class BarrierRun implements Runnable {
boolean flag;
int N;
public BarrierRun(boolean flag, int n) {
this.flag = flag;
N = n;
}
@Override
public void run() {
if (flag) {
System.out.println("士兵:" + N + "个, 任务完成!");
} else {
System.out.println("士兵:" + N + "个, 集合完毕!");
flag = true;
}
}
}
public static void main(String[] args){
final int N = 5;
Thread[] allSoldier = new Thread[N];
boolean flag = false;
CyclicBarrier cyclic = new CyclicBarrier(N, new BarrierRun(flag, N));
// 设置屏障点, 主要为了执行这个方法.
System.out.println("集合任务!");
for (int i = 0; i < N; i++) {
System.out.println("士兵" + i + " 报到!");
allSoldier[i] = new Thread(new Soldier(cyclic, "士兵" + i));
allSoldier[i].start();
}
}
}
结果
一个线程阻塞工具, 可以在任意位置让线程阻塞.
与suspend()比较, 如果unpark发生在park之前, 并不会导致线程冻结, 也不需要获取锁.
API
1 LockSupport.park();
2 LockSupport.unpark(t1);
中断响应
能够响应中断,但不抛出异常。
中断响应的结果是,park()函数的返回,可以从Thread.interrupted()得到中断标志
public class LockSupportDemo {
public static Object u = new Object();
static ChangeObjectThread t1 = new ChangeObjectThread("t1");
static ChangeObjectTh