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

本文深入探讨了Java中三种重要的并发控制工具:CountDownLatch、CyclicBarrier和Semaphore的使用方法及其实现原理。通过实例展示了如何利用这些工具进行线程间的同步和资源的控制,为理解和运用Java并发编程提供了实用指南。
5900

被折叠的 条评论
为什么被折叠?



