1.CountDownLatch
public static void main(String args[]) {
final CountDownLatch start=new CountDownLatch(1);
final CountDownLatch end=new CountDownLatch(10);
for(int i=0;i<10;i++) {
int index=i;
Thread t=new Thread(new Runnable() {
@Override
public void run() {
// TODO Auto-generated method stub
try {
start.await();
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
System.out.println(index+"...");
end.countDown();
}
});
t.start();
}
System.out.println("start ... ");
start.countDown();
try {
end.await();
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
System.out.println("over ... ");
}
执行结果
start ...
0...
5...
4...
3...
1...
2...
6...
8...
9...
7...
over ...
2.CyclicBarrier
static CyclicBarrier cb=new CyclicBarrier(3);
public static void main(String args[]) {
for(int i=0;i<3;i++) {
final int a=i;
Thread t=new Thread(new Runnable() {
@Override
public void run() {
// TODO Auto-generated method stub
System.out.println(a+"reached ...");
try {
cb.await();
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (BrokenBarrierException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
System.out.println(a+"over ...");
}
});
t.start();
}
}
执行结果
0reached ...
1reached ...
2reached ...
2over ...
0over ...
1over ...
3.Semaphore
private static final Semaphore semaphore=new Semaphore(3);
public static void main(String args[]) {
for(int i=0;i<10;i++) {
final int a=i;
Thread t=new Thread(new Runnable() {
@Override
public void run() {
// TODO Auto-generated method stub
System.out.println(a+"开始排队 ...");
try {
semaphore.acquire();
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
System.out.println(a+"得到信号 ...");
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
System.out.println(a+"释放信号 ...");
semaphore.release();
System.out.println("###################当前可用信号"+semaphore.availablePermits());
}
}) ;
t.start();
}
}
执行结果
1开始排队 ...
0开始排队 ...
2开始排队 ...
3开始排队 ...
0得到信号 ...
1得到信号 ...
2得到信号 ...
5开始排队 ...
7开始排队 ...
6开始排队 ...
9开始排队 ...
8开始排队 ...
4开始排队 ...
1释放信号 ...
0释放信号 ...
###################当前可用信号1
5得到信号 ...
2释放信号 ...
###################当前可用信号1
6得到信号 ...
###################当前可用信号1
3得到信号 ...
5释放信号 ...
3释放信号 ...
7得到信号 ...
9得到信号 ...
6释放信号 ...
###################当前可用信号0
8得到信号 ...
###################当前可用信号1
###################当前可用信号1
8释放信号 ...
###################当前可用信号1
7释放信号 ...
###################当前可用信号1
9释放信号 ...
4得到信号 ...
###################当前可用信号2
4释放信号 ...
###################当前可用信号3